diff --git a/crates/typst-library/src/visualize/curve.rs b/crates/typst-library/src/visualize/curve.rs index 4bc5b45fb..9f4a21a4e 100644 --- a/crates/typst-library/src/visualize/curve.rs +++ b/crates/typst-library/src/visualize/curve.rs @@ -476,26 +476,18 @@ impl Curve { /// Computes the size of the bounding box of this curve. pub fn bbox_size(&self) -> Size { - let mut min_x = Abs::inf(); - let mut min_y = Abs::inf(); - let mut max_x = -Abs::inf(); - let mut max_y = -Abs::inf(); + let mut min = Point::splat(Abs::inf()); + let mut max = Point::splat(-Abs::inf()); let mut cursor = Point::zero(); for item in self.0.iter() { match item { CurveItem::Move(to) => { - min_x = min_x.min(cursor.x); - min_y = min_y.min(cursor.y); - max_x = max_x.max(cursor.x); - max_y = max_y.max(cursor.y); cursor = *to; } CurveItem::Line(to) => { - min_x = min_x.min(cursor.x); - min_y = min_y.min(cursor.y); - max_x = max_x.max(cursor.x); - max_y = max_y.max(cursor.y); + min = min.min(cursor).min(*to); + max = max.max(cursor).max(*to); cursor = *to; } CurveItem::Cubic(c0, c1, end) => { @@ -507,17 +499,17 @@ impl Curve { ); let bbox = cubic.bounding_box(); - min_x = min_x.min(Abs::pt(bbox.x0)).min(Abs::pt(bbox.x1)); - min_y = min_y.min(Abs::pt(bbox.y0)).min(Abs::pt(bbox.y1)); - max_x = max_x.max(Abs::pt(bbox.x0)).max(Abs::pt(bbox.x1)); - max_y = max_y.max(Abs::pt(bbox.y0)).max(Abs::pt(bbox.y1)); + min.x = min.x.min(Abs::pt(bbox.x0)).min(Abs::pt(bbox.x1)); + min.y = min.y.min(Abs::pt(bbox.y0)).min(Abs::pt(bbox.y1)); + max.x = max.x.max(Abs::pt(bbox.x0)).max(Abs::pt(bbox.x1)); + max.y = max.y.max(Abs::pt(bbox.y0)).max(Abs::pt(bbox.y1)); cursor = *end; } CurveItem::Close => (), } } - Size::new(max_x - min_x, max_y - min_y) + Size::new(max.x - min.x, max.y - min.y) } } diff --git a/tests/ref/curve-stroke-gradient-sharp.png b/tests/ref/curve-stroke-gradient-sharp.png new file mode 100644 index 000000000..ae2a86ef0 Binary files /dev/null and b/tests/ref/curve-stroke-gradient-sharp.png differ diff --git a/tests/ref/curve-stroke-gradient.png b/tests/ref/curve-stroke-gradient.png index 042f540a5..7d5b1add4 100644 Binary files a/tests/ref/curve-stroke-gradient.png and b/tests/ref/curve-stroke-gradient.png differ diff --git a/tests/suite/visualize/curve.typ b/tests/suite/visualize/curve.typ index 14a1c0cc8..c94f763c4 100644 --- a/tests/suite/visualize/curve.typ +++ b/tests/suite/visualize/curve.typ @@ -130,6 +130,16 @@ down, up, down, up, down, ) +--- curve-stroke-gradient-sharp --- +#set page(width: auto) +#let down = curve.line((40pt, 40pt), relative: true) +#let up = curve.line((40pt, -40pt), relative: true) + +#curve( + stroke: 4pt + gradient.linear(red, blue).sharp(3), + down, up, down, up, down, +) + --- curve-fill-rule --- #stack( dir: ltr,