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.
pub fn resolve(self, range: Range<Length>) -> 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,
}
}
}

View File

@ -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);

View File

@ -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;

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;
offset += frame.size.w;

View File

@ -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;

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)
#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)