summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-02-12 12:15:03 +0100
committerLaurenz <laurmaedje@gmail.com>2023-02-12 12:57:35 +0100
commit8951b1923a581f7454ddf4dbe3e55f69ce5799f9 (patch)
tree86ba96f9f83ca3983bddf13ad37df2469877720d
parente873468ea7deedd6d43f24100591c60a7de5accc (diff)
Skip grid region if one cell is empty
-rw-r--r--library/src/layout/grid.rs17
-rw-r--r--tests/ref/bugs/grid-2.pngbin0 -> 9958 bytes
-rw-r--r--tests/ref/layout/grid-3.pngbin44308 -> 44312 bytes
-rw-r--r--tests/typ/bugs/grid-2.typ18
4 files changed, 31 insertions, 4 deletions
diff --git a/library/src/layout/grid.rs b/library/src/layout/grid.rs
index 46518f82..544b76ed 100644
--- a/library/src/layout/grid.rs
+++ b/library/src/layout/grid.rs
@@ -482,6 +482,7 @@ impl<'a, 'v> GridLayouter<'a, 'v> {
/// regions.
fn layout_auto_row(&mut self, y: usize) -> SourceResult<()> {
let mut resolved: Vec<Abs> = vec![];
+ let mut skip = false;
// Determine the size for each region of the row.
for (x, &rcol) in self.rcols.iter().enumerate() {
@@ -490,13 +491,15 @@ impl<'a, 'v> GridLayouter<'a, 'v> {
pod.first.x = rcol;
pod.base.x = rcol;
- let mut sizes = cell
- .layout(self.vt, self.styles, pod)?
- .into_iter()
- .map(|frame| frame.height());
+ let frames = cell.layout(self.vt, self.styles, pod)?.into_frames();
+ if let [first, rest @ ..] = frames.as_slice() {
+ skip |=
+ first.is_empty() && rest.iter().any(|frame| !frame.is_empty());
+ }
// For each region, we want to know the maximum height any
// column requires.
+ let mut sizes = frames.iter().map(|frame| frame.height());
for (target, size) in resolved.iter_mut().zip(&mut sizes) {
target.set_max(size);
}
@@ -519,6 +522,12 @@ impl<'a, 'v> GridLayouter<'a, 'v> {
return Ok(());
}
+ // Skip the first region if it's empty for some cell.
+ if skip && !self.regions.in_last() {
+ self.finish_region()?;
+ resolved.remove(0);
+ }
+
// Expand all but the last region if the space is not
// eaten up by any fr rows.
if self.fr.is_zero() {
diff --git a/tests/ref/bugs/grid-2.png b/tests/ref/bugs/grid-2.png
new file mode 100644
index 00000000..2d39e186
--- /dev/null
+++ b/tests/ref/bugs/grid-2.png
Binary files differ
diff --git a/tests/ref/layout/grid-3.png b/tests/ref/layout/grid-3.png
index d9562e9a..f6c17835 100644
--- a/tests/ref/layout/grid-3.png
+++ b/tests/ref/layout/grid-3.png
Binary files differ
diff --git a/tests/typ/bugs/grid-2.typ b/tests/typ/bugs/grid-2.typ
new file mode 100644
index 00000000..bdcdf548
--- /dev/null
+++ b/tests/typ/bugs/grid-2.typ
@@ -0,0 +1,18 @@
+// Grid now skips a remaining region when one of the cells
+// doesn't fit into it at all.
+
+---
+#set page(height: 100pt)
+#grid(
+ columns: (2cm, auto),
+ rows: (auto, auto),
+ rect(width: 100%, fill: red),
+ rect(width: 100%, fill: blue),
+ rect(width: 100%, height: 80%, fill: green),
+ [Hello],
+)
+
+---
+#set page(height: 60pt)
+#lorem(5)
+- #lorem(5)