From e4e4c1876ff0b08bb144dccf74cc2a83c0a6c6aa Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 29 Nov 2021 16:13:53 +0100 Subject: [PATCH] Fix square and circle width & height --- src/library/shape.rs | 40 +++++++++++++++-------------- tests/ref/layout/aspect.png | Bin 0 -> 3618 bytes tests/typ/layout/aspect.typ | 50 ++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 tests/ref/layout/aspect.png create mode 100644 tests/typ/layout/aspect.typ diff --git a/src/library/shape.rs b/src/library/shape.rs index 2f2f9686d..61c0d6e32 100644 --- a/src/library/shape.rs +++ b/src/library/shape.rs @@ -119,10 +119,16 @@ impl Layout for ShapeNode { // Relayout with full expansion into square region to make sure // the result is really a square or circle. if self.kind.is_quadratic() { - let size = frames[0].item.size; - let desired = size.x.max(size.y); - let limit = regions.current.x.min(regions.current.y); - pod.current = Size::splat(desired.min(limit)); + let length = if regions.expand.x || regions.expand.y { + let target = regions.expand.select(regions.current, Size::zero()); + target.x.max(target.y) + } else { + let size = frames[0].item.size; + let desired = size.x.max(size.y); + desired.min(regions.current.x).min(regions.current.y) + }; + + pod.current = Size::splat(length); pod.expand = Spec::splat(true); frames = child.layout(ctx, &pod); frames[0].cts = Constraints::tight(regions); @@ -130,27 +136,27 @@ impl Layout for ShapeNode { } else { // The default size that a shape takes on if it has no child and // enough space. - let mut default = Size::splat(Length::pt(30.0)); - if !self.kind.is_quadratic() { - default.x *= 1.5; - } - let mut size = - regions.expand.select(regions.current, default).min(regions.current); + Size::new(Length::pt(45.0), Length::pt(30.0)).min(regions.current); - // Make sure the result is really a square or circle. if self.kind.is_quadratic() { - size.x = size.x.min(size.y); - size.y = size.x; + let length = if regions.expand.x || regions.expand.y { + let target = regions.expand.select(regions.current, Size::zero()); + target.x.max(target.y) + } else { + size.x.min(size.y) + }; + size = Size::splat(length); + } else { + size = regions.expand.select(regions.current, size); } frames = vec![Frame::new(size).constrain(Constraints::tight(regions))]; } - let frame = Rc::make_mut(&mut frames.last_mut().unwrap().item); - // Add fill and/or stroke. if self.fill.is_some() || self.stroke.is_some() { + let frame = Rc::make_mut(&mut frames[0].item); let geometry = match self.kind { ShapeKind::Square | ShapeKind::Rect => Geometry::Rect(frame.size), ShapeKind::Circle | ShapeKind::Ellipse => Geometry::Ellipse(frame.size), @@ -165,10 +171,6 @@ impl Layout for ShapeNode { frame.prepend(Point::zero(), Element::Shape(shape)); } - // Ensure frame size matches regions size if expansion is on. - let target = regions.expand.select(regions.current, frame.size); - frame.resize(target, Align::LEFT_TOP); - frames } } diff --git a/tests/ref/layout/aspect.png b/tests/ref/layout/aspect.png new file mode 100644 index 0000000000000000000000000000000000000000..62f17ba4f540655a60a115e3d11af528b4b78f11 GIT binary patch literal 3618 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 vA4!+^Q_g=`^ec089p;C9<+M8Qb`em^)iGs