Simpler alignment resolving

This commit is contained in:
Laurenz 2021-11-23 14:25:50 +01:00
parent 4f9e5819bb
commit c77c5a0f0a
7 changed files with 31 additions and 19 deletions

View File

@ -38,12 +38,12 @@ impl Align {
} }
} }
/// Returns the position of this alignment in the given range. /// Returns the position of this alignment in the given length.
pub fn resolve(self, range: Range<Length>) -> Length { pub fn resolve(self, length: Length) -> Length {
match self { match self {
Self::Left | Self::Top => range.start, Self::Left | Self::Top => Length::zero(),
Self::Center | Self::Horizon => (range.start + range.end) / 2.0, Self::Center | Self::Horizon => length / 2.0,
Self::Right | Self::Bottom => range.end, Self::Right | Self::Bottom => length,
} }
} }
} }

View File

@ -45,8 +45,8 @@ impl Layout for AlignNode {
let aligns = self.aligns.unwrap_or(Spec::new(Align::Left, Align::Top)); let aligns = self.aligns.unwrap_or(Spec::new(Align::Left, Align::Top));
let offset = Point::new( let offset = Point::new(
aligns.x.resolve(Length::zero() .. canvas.w - frame.size.w), aligns.x.resolve(canvas.w - frame.size.w),
aligns.y.resolve(Length::zero() .. canvas.h - frame.size.h), aligns.y.resolve(canvas.h - frame.size.h),
); );
let frame = Rc::make_mut(frame); let frame = Rc::make_mut(frame);

View File

@ -236,8 +236,8 @@ impl<'a> FlowLayouter<'a> {
ruler = ruler.max(aligns.y); ruler = ruler.max(aligns.y);
// Align horizontally and vertically. // Align horizontally and vertically.
let x = aligns.x.resolve(Length::zero() .. size.w - frame.size.w); let x = aligns.x.resolve(size.w - frame.size.w);
let y = ruler.resolve(before .. before + size.h - self.used.h); let y = before + ruler.resolve(size.h - self.used.h);
let pos = Point::new(x, y); let pos = Point::new(x, y);
before += frame.size.h; before += frame.size.h;

View File

@ -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; let y = self.baseline - frame.baseline;
offset += frame.size.w; offset += frame.size.w;

View File

@ -230,19 +230,21 @@ impl<'a> StackLayouter<'a> {
before += v.resolve(self.fr, remaining); before += v.resolve(self.fr, remaining);
} }
StackItem::Frame(frame, align) => { 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. // Align along the block axis.
let parent = size.get(self.axis); let parent = size.get(self.axis);
let child = frame.size.get(self.axis); let child = frame.size.get(self.axis);
let block = ruler.resolve(if self.stack.dir.is_positive() { let block = ruler.resolve(parent - self.used.block)
let after = self.used.block - before; + if self.stack.dir.is_positive() {
before .. parent - after before
} else { } else {
let before_with_self = before + child; self.used.block - child - before
let after = self.used.block - before_with_self; };
after .. parent - before_with_self
});
let pos = Gen::new(Length::zero(), block).to_point(self.axis); let pos = Gen::new(Length::zero(), block).to_point(self.axis);
before += child; before += child;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 714 B

View File

@ -18,6 +18,16 @@
#page(width: 50pt, margins: 0pt) #page(width: 50pt, margins: 0pt)
#stack(dir: btt, ..items) #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. // Test spacing.
#page(width: 50pt, margins: 0pt) #page(width: 50pt, margins: 0pt)