From c77c5a0f0ae6560a03a85e847006c29de9c7ae62 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 23 Nov 2021 14:25:50 +0100 Subject: [PATCH] Simpler alignment resolving --- src/geom/align.rs | 10 +++++----- src/library/align.rs | 4 ++-- src/library/flow.rs | 4 ++-- src/library/par.rs | 2 +- src/library/stack.rs | 20 +++++++++++--------- tests/ref/layout/stack-1.png | Bin 317 -> 714 bytes tests/typ/layout/stack-1.typ | 10 ++++++++++ 7 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/geom/align.rs b/src/geom/align.rs index 4be696e6e..f068b821b 100644 --- a/src/geom/align.rs +++ b/src/geom/align.rs @@ -38,12 +38,12 @@ impl Align { } } - /// Returns the position of this alignment in the given range. - pub fn resolve(self, range: Range) -> Length { + /// Returns the position of this alignment in the given length. + pub fn resolve(self, length: Length) -> Length { match self { - Self::Left | Self::Top => range.start, - Self::Center | Self::Horizon => (range.start + range.end) / 2.0, - Self::Right | Self::Bottom => range.end, + Self::Left | Self::Top => Length::zero(), + Self::Center | Self::Horizon => length / 2.0, + Self::Right | Self::Bottom => length, } } } diff --git a/src/library/align.rs b/src/library/align.rs index 7ce749d1f..fa4d17c55 100644 --- a/src/library/align.rs +++ b/src/library/align.rs @@ -45,8 +45,8 @@ impl Layout for AlignNode { let aligns = self.aligns.unwrap_or(Spec::new(Align::Left, Align::Top)); let offset = Point::new( - aligns.x.resolve(Length::zero() .. canvas.w - frame.size.w), - aligns.y.resolve(Length::zero() .. canvas.h - frame.size.h), + aligns.x.resolve(canvas.w - frame.size.w), + aligns.y.resolve(canvas.h - frame.size.h), ); let frame = Rc::make_mut(frame); diff --git a/src/library/flow.rs b/src/library/flow.rs index 5271eca93..93dcbea67 100644 --- a/src/library/flow.rs +++ b/src/library/flow.rs @@ -236,8 +236,8 @@ impl<'a> FlowLayouter<'a> { ruler = ruler.max(aligns.y); // Align horizontally and vertically. - let x = aligns.x.resolve(Length::zero() .. size.w - frame.size.w); - let y = ruler.resolve(before .. before + size.h - self.used.h); + let x = aligns.x.resolve(size.w - frame.size.w); + let y = before + ruler.resolve(size.h - self.used.h); let pos = Point::new(x, y); before += frame.size.h; diff --git a/src/library/par.rs b/src/library/par.rs index 5edffeaad..46dc304a4 100644 --- a/src/library/par.rs +++ b/src/library/par.rs @@ -499,7 +499,7 @@ impl<'a> LineLayout<'a> { } } - let x = self.par.align.resolve(offset .. remaining + offset); + let x = offset + self.par.align.resolve(remaining); let y = self.baseline - frame.baseline; offset += frame.size.w; diff --git a/src/library/stack.rs b/src/library/stack.rs index 3d91bec71..a2e80ba5f 100644 --- a/src/library/stack.rs +++ b/src/library/stack.rs @@ -230,19 +230,21 @@ impl<'a> StackLayouter<'a> { before += v.resolve(self.fr, remaining); } StackItem::Frame(frame, align) => { - ruler = ruler.max(align); + if self.stack.dir.is_positive() { + ruler = ruler.max(align); + } else { + ruler = ruler.min(align); + } // Align along the block axis. let parent = size.get(self.axis); let child = frame.size.get(self.axis); - let block = ruler.resolve(if self.stack.dir.is_positive() { - let after = self.used.block - before; - before .. parent - after - } else { - let before_with_self = before + child; - let after = self.used.block - before_with_self; - after .. parent - before_with_self - }); + let block = ruler.resolve(parent - self.used.block) + + if self.stack.dir.is_positive() { + before + } else { + self.used.block - child - before + }; let pos = Gen::new(Length::zero(), block).to_point(self.axis); before += child; diff --git a/tests/ref/layout/stack-1.png b/tests/ref/layout/stack-1.png index 535632c4c71a39c3ddb0dba235a3fa054dc757ea..46c8d9d62fc1bf52caf412b13266edd4b9473cbb 100644 GIT binary patch literal 714 zcmeAS@N?(olHy`uVBq!ia0vp^6$}iFwH(Yq)(?i5=Rhhmz$e7@|NsB*-@m_q|Ni;& z=g*uuGyiqafddEj@87?9^X3g3HmqO2e*XOVGiT21@9%GDXsEBRSDw4pd7*lKetue7 zT0%lXe0;pWzrU}quY-ewy}iA$v9W=Hfxf=Jf`Wp)yu6f@lz@N$KR-XvHm&?;atsVi zGM+AuAr-gY-n^UFu@MMwOcI`E0(~9*(k~hW2ocN*s z%bgQwh31w2hr7HYWpJ3jx=^RpqXSaSr6ECVNj}k${35?(eTP zG(v&D@Xrr2KqJB6!wr{xGR$mHQ1;qj+u?@{JP=@0{$n2_(6-+VPp@@y0Nr5o;Dvv} z=as8=3VQBNpY`sL6MGM2E?F*vH^)F6wyR@qQPQ>)v zQ&u12k6C*7qF~-z>%B(1zA(MMT`(nYu}0O+{gLInL^ZkX3v6V*icha&+jh0fDdpym z#&G-XyE1a7mriyGe6sEO{)4+G7t8QO7pz+v78-iBm4C;LZ{<4+8@o5{j$JvE>wAD+ z(x+b>v-j-XlC}Nv-%7*7FK3$VJQVgls{QcMt8q~!6)Tm3rq!jDN_-DC=-8c;&3Zgj z^2oe+|Nk>*&dh%uw0ZO9nKNfLG&CsBUF*D1 zJuNNG*VotB*jP$R3aHkhaqT`JbNM;ajq%5H_!X_CLIHw!#4|EV)n5f zHkczFzx$v8&+}ux-_IvVv>87-o&c1U{1}&gd)GQ3Yv;$!(maO?#B8K_`XA*^65PHv z`acIyn_xfN;r|cPTHpUF2dawv5I8^XhsKV%>3^cMfy%XPBzgEBeNNaNufuZ~C~siX tt&#mwEEmXhKe%+tFWm|*|FVETOvW9Viu-*Hl7QZ0@O1TaS?83{1OUG{eN+Gd diff --git a/tests/typ/layout/stack-1.typ b/tests/typ/layout/stack-1.typ index 2fbe22e3d..02083d2bc 100644 --- a/tests/typ/layout/stack-1.typ +++ b/tests/typ/layout/stack-1.typ @@ -18,6 +18,16 @@ #page(width: 50pt, margins: 0pt) #stack(dir: btt, ..items) +--- +// Test RTL alignment. +#page(width: 50pt, margins: 5pt) +#font(8pt) +#stack(dir: rtl, + align(center, [A]), + align(left, [B]), + [C], +) + --- // Test spacing. #page(width: 50pt, margins: 0pt)