PackageTrack
Sign in Get early access

kurbo

A 2D curves library

0.13.1 39M downloads/mo #1447 most downloaded on crates.io linebender/kurbo

What this package is like to depend on

Last release 3 months ago

13 May 2026

Release timing varies

gaps range from 2 weeks to 8 months

Rarely documented

notes for 8 of 45 stable releases

2 versions withdrawn

withdrawn after publishing

8 years old

47 releases · first in 2018

3 releases in the last 12 months

see the full history below

Release timeline

47 releases · Dec 2018 to May 2026
2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 47
  1. 0.13.1 13 May 2026
    Release notes

    Crates.io | Docs

    This release has an MSRV of 1.85.

    Added

    • Stroke::is_finite and Stroke::is_nan. (#545 by @waywardmonkeys)
    • Component-wise Insets::min/max methods. (#548 by @xStrom)
    • Ability to add and subtract Insets from other Insets. (#549 by @xStrom)
    • Arc now implements ParamCurve. (#378 by @waywardmonkeys)
    • Affine::{pre,then}_skew and Affine::{pre,then}_reflect fluent composition helpers. (#563 by @waywardmonkeys)
    • Three transform matrix norms: Affine::{nuclear_norm_squared,frobenius_norm_squared,spectral_norm}. (#569 by @tomcur)
    • StrokeOpts::stable_dash_order to keep dashes at fixed path-relative positions instead of merging the first/last dash across. (#550 by @RobertBrewitz)
    • expand_path anisotropic path expansion. (#575 by @raphlinus)

    Changed

    • Improved performance of RoundedRect::winding and RoundedRect::contains. (#534 by @tomcur)
    • Axis, Ellipse::from_affine, Insets, Line::reversed, Rect::min_x/max_x/min_y/max_y, RoundedRectRadii::abs/clamp/as_single_radius, RoundedRect::width/height/radii/rect/origin/center, Size::aspect_ratio, Stroke::new/with_join/with_miter_limit/with_start_cap/with_end_cap/with_caps are all now const. (#536 by @xStrom, #539 and #561 by @tomcur)
    • Improved performance of Ellipse::area. Note: for non-finite ellipses, this method may now return f64::INFINITY where it returned f64::NAN before. (#559 by @tomcur)
    • Improved numerical robustness of winding numbers for paths. (#537 by @jneem)

    Fixed

    • Affine::pre_rotate_about calculation. (#567 by @dannymcgee)
    • Now closing subpaths when computing area for expansion. (#580 by @raphlinus)
    • Odd-length dash patterns no longer swap dashes and gaps when dash_offset increases. (#585 by @Keavon)

    New Contributors

    Full Changelog: v0.13.0...v0.13.1

    Open source →
    Release notes

    This release has an [MSRV][] of 1.85.

    Open source →
  2. 0.13.0 27 Nov 2025
    Release notes

    Crates.io | Docs

    This release has an MSRV of 1.85.

    Added

    • The newly added BezPath::into_elements method allows getting all path elements as a Vec without allocating, consuming the original path. This is the counterpart of BezPath::from_vec. (#504 by @cmyr)
    • Add a derive Hash to the Axis type. (#527 by @jrmoulton)

    Changed

    • Speed up methods like Ellipse::radii by reworking the singular value decomposition expression. (#499 by @tomcur)
    • The Line::nearest method to calculate the projection of a point onto a line segment has been made more performant. (#505 by @tomcur)
    • The QuadBez::arclen calculation has been made more numerically stable (#503 by @jneem).
    • SvgParseError now implements core::error:Error. It previously implemented std::error::Error in std-enabled builds. (#517 by @Bombaninha)
    • The behavior of open versus closed shapes when using BezPath::extend (extending Bezier paths using an iterator over PathEl) has been clarified. #523 by @DJMcNab)
    • More methods are marked inline. (#506 by @LaurenzV, #509 by @tomcur)

    The following functions are now callable from const contexts. (#510, #512, #521, #522, #524, #525, #526 by @tomcur)

    • Affine::{skew, then_translate, map_unit_square, as_coeffs, determinant, inverse, translation, with_translation}
    • Point::midpoint
    • Rect::{width, height, origin, size, area, is_zero_area, center, aspect_ratio_width, overlap, contains_rect, union, intersect, inscribed_rect_with_aspect_ratio, inflate, scale_from_origin, abs}
    • Size::{max_side, min_side, area, is_zero_area, min, max, clamp, aspect_ratio_width}
    • In addition, the is_finite and is_nan methods on the following types are now const: Affine, Circle, ConstPoint, CubicBez, Ellipse, Insets, Line, Point, QuadBez, Rect, RoundedRect, RoundedRectRadii, Size, Triangle, Vec2.

    New Contributors

    Full Changelog: v0.12.0...v0.13.0

    Open source →
    Release notes

    This release has an [MSRV][] of 1.85.

    Open source →
  3. 0.12.0 04 Sep 2025
    Release notes

    Crates.io | Docs

    This release has an MSRV of 1.82. It was increased to support floating point math in const functions.

    Added

    • Newly public StrokeCtx allows for reusing allocations when stroking multiple paths. (#475 by @LaurenzV)
    • New Axis type. (#476 by @PoignardAzur)
    • Add Ellipse::major_radius and Ellipse::minor_radius methods. (#497 by @tomcur)

    Changed

    • The implementation of stroking is much faster. (#427 by @raphlinus)
    • More Vec2 methods can now be called in const contexts. (#479 by @tomcur)
    • aspect_ratio on Rect and Size has been deprecated and replaced with aspect_ratio_width.
      This is because the implementation of aspect_ratio used the ratio of height to width, whereas
      aspect rations are otherwise always ratios of width to height. (#486 by @ErisianArchitect and @DJMcNab)
    • Deprecated contained_rect_with_aspect_ratio, replaced with inscribed_rect_with_aspect_ratio, which
      incidentally also uses the usual definition of aspect ratio (where the old name didn't). (#486 by @DJMcNab)
    • Breaking change: The deprecated offset::CubicOffset has been removed, and replaced by
      offset::offset_cubic. (#489 by @jneem)
    • Several methods marked #[inline]. (#472, #480, #496 by @tomcur)

    Fixed

    • Improved cubic to quadratic conversion handling for degenerate cubic curves with 3-4 consecutive equal control points. The approximation now correctly handles edge cases where cubics degenerate to lines or single points, matching fonttools' cu2qu behavior. (#485 by @anthrotype)
    • Fix miter join in dashed strokes. (#490 by @grebmeg)

    Removed

    • Breaking change: DashIterator has been removed. Replace DashIterator::new with dash. (#488 by @DJMcNab)
    • Breaking change: The previously deprecated BezPath::flatten, Ellipse::[with_]x_rotation, {Rect, Size}::is_empty, Shape::[in]to_bez_path,
      and TranslateScale::as_tuple have been removed. (#487 by @DJMcNab)

    New Contributors

    Full Changelog: v0.11.3...v0.12.0

    Open source →
    Release notes

    This release has an [MSRV][] of 1.82. It was increased to support floating point math in const functions.

    Added

    • Newly public StrokeCtx allows for reusing allocations when stroking multiple paths. ([#475][] by [@LaurenzV][])
    • Axis type. ([#476][] by [@PoignardAzur][])
    • Ellipse::major_radius and Ellipse::minor_radius methods. ([#497][] by [@tomcur][])

    Changed

    • The implementation of stroking is much faster. ([#427][] by [@raphlinus][])
    • More Vec2 methods can now be called in const contexts. ([#479][] by [@tomcur][])
    • aspect_ratio on Rect and Size has been deprecated and replaced with aspect_ratio_width. This is because the implementation of aspect_ratio used the ratio of height to width, whereas aspect rations are otherwise always ratios of width to height. ([#486][] by [@ErisianArchitect][] and [@DJMcNab][])
    • Deprecated contained_rect_with_aspect_ratio, replaced with inscribed_rect_with_aspect_ratio, which incidentally also uses the usual definition of aspect ratio (where the old name didn't). ([#486][] by [@DJMcNab][])
    • Breaking change: The deprecated offset::CubicOffset has been removed, and replaced by offset::offset_cubic. ([#489][] by [@jneem][])
    • Several methods marked #[inline]. ([#472][], [#480][], [#496][] by [@tomcur][])

    Fixed

    • Improved cubic to quadratic conversion handling for degenerate cubic curves with 3-4 consecutive equal control points. The approximation now correctly handles edge cases where cubics degenerate to lines or single points, matching fonttools' cu2qu behavior. ([#485][] by [@anthrotype][])
    • Miter join in dashed strokes. ([#490][] by [@gemberg][])

    Removed

    • Breaking change: DashIterator has been removed. Replace DashIterator::new with dash. ([#488][] by [@DJMcNab][])
    • Breaking change: The previously deprecated BezPath::flatten, Ellipse::[with_]x_rotation, {Rect, Size}::is_empty, Shape::[in]to_bez_path, and TranslateScale::as_tuple have been removed. ([#487][] by [@DJMcNab][])
    Open source →
  4. 0.11.3 21 Jul 2025
    Release notes

    Crates.io | Docs

    This release has an MSRV of 1.65.

    Added

    • Add current_position method to BezPath. (#462 by @sagudev)
    • Add From conversions between euclid and kurbo types behind the euclid feature. (#463 by @sagudev)
    • Add Green's theorem moments. (#452 by @simoncozens)
    • Make Vec2::splat public. (#469 by @xorgy)

    Changed

    • Let more methods take Into<Point> instead of Point. (#466 by @sagudev)

      Note: this can impact type inference.

    • Inline the Mul<PathEl> implementation for Affine. (#461 by @LaurenzV)

    • Inline the next method of the ToQuads iterator. (#460 by @LaurenzV)

    • Avoid calling f64::hypot, as it calls a slow library function. (#448 by @beholdnec, #451 by @raphlinus)

    Fixed

    • Documentation of RoundedRect no longer incorrectly specifies the corner radii are equal. (#447 by @tomcur)
    • Fixed negative dash offset by normalization. (#454 by @sagudev)
    • Use exact endpoints for PathSeg. (#465 by @jneem)

    New Contributors

    Full Changelog: v0.11.2...v0.11.3

    Open source →
    Release notes

    This release has an [MSRV][] of 1.65.

    Added

    • current_position method to BezPath. ([#462][] by [@sagudev][])
    • From conversions between euclid and kurbo types behind the euclid feature. ([#463][] by [@sagudev][])
    • Green's theorem moments. ([#452][] by [@simoncozens][])
    • Made Vec2::splat public. ([#469][] by [@xorgy][])

    Changed

    • Let more methods take Into<Point> instead of Point. ([#466][] by [@sagudev][])

      Note: this can impact type inference.

    • Inline the Mul<PathEl> implementation for Affine. ([#461][] by [@LaurenzV][])

    • Inline the next method of the ToQuads iterator. ([#460][] by [@LaurenzV][])

    • Avoid calling f64::hypot, as it calls a slow library function. ([#448][] by [@beholdnec][], [#451][] by [@raphlinus][])

    Fixed

    • Documentation of RoundedRect no longer incorrectly specifies the corner radii are equal. ([#447][] by [@tomcur][])
    • Negative dash offset by normalization. ([#454][] by [@sagudev][])
    • Now using exact endpoints for PathSeg. ([#465][] by [@jneem])
    Open source →
  5. 0.11.2 28 Apr 2025
    Release notes

    0.11.2 (2025-04-28)

    This release has an MSRV of 1.65.

    Added

    Changed

    • Reduce number of operations in Triangle::circumscribed_circle. (#390 by @tomcur)
    • Numerically approximate ellipse perimeter. (#383, #407 by @tomcur)
    • Always inline trivial casts, splats, and swizzles. (#428 by @xorgy)

    Fixed

    New Contributors

    Full Changelog: v0.11.1...v0.11.2

    Open source →
    Release notes

    This release has an [MSRV][] of 1.65.

    Added

    • Stroke is now PartialEq, StrokeOpts is now Clone, Copy, Debug, Eq, PartialEq. ([#379][] by [@waywardmonkeys][])
    • Implemented Sum for Vec2. ([#399][] by [@Philipp-M][])
    • Triangle shape. ([#350][] by [@juliapaci][], [#387][] by [@tomcur][])
    • Implemented Div<f64> and Mul<f64> for Insets. ([#384][] by [@liferooter][])
    • Vec2::turn_90 and Vec2::rotate_scale methods ([#409][] by [@raphlinus][])
    • min and max methods to Size. ([#412][] by [@nils-mathieu][])
    • INFNITY constant to Size. ([#413][] by [@nils-mathieu][])
    • BezPath::with_capacity method ([#418][] by [@LaurenzV][])
    • Affine::scale_about and Affine::then_scale_about. ([#429][] by [@xorgy][])

    Changed

    • Reduced number of operations in Triangle::circumscribed_circle. ([#390][] by [@tomcur][])
    • Numerically approximate ellipse perimeter. ([#383][], [#407][] by [@tomcur][])
    • Always inline trivial casts, splats, and swizzles. ([#428][] by [@xorgy][])

    Fixed

    • Documentation of Affine::svd. ([#388][] by [@tomcur][])
    • Documentation of cross product. ([#409][] by [@raphlinus][])
    Open source →
  6. 0.11.1 12 Sep 2024
    Release notes

    0.11.1 (2024-09-12)

    This release has an MSRV of 1.65.

    Added

    Changed

    Fixed

    New Contributors

    Full Changelog: v0.11.0...v0.11.1

    Open source →
    Release notes

    This release has an [MSRV][] of 1.65.

    Added

    • From (f32, f32) for Point. ([#339][] by [@rsheeter][])
    • Rect::overlaps and Rect::contains_rect. ([#347][] by [@nils-mathieu][])
    • CubicBez::tangents ([#288][] by [@raphlinus][])
    • Arc::reversed. ([#367][] by [@waywardmonkeys][])
    • CircleSegment::inner_arc and CircleSegment::outer_arc ([#368][] by [@waywardmonkeys][])
    • Rect::is_zero_area and Size::is_zero_area and deprecate their is_empty methods. ([#370][] by [@waywardmonkeys][])
    • Line::reversed and Line::midpoint. ([#375][] by [@waywardmonkeys][])
    • Allowing construction of Line from (Point, Point) and (Point, Vec2). ([#376][] by [@waywardmonkeys][])

    Changed

    • Moved Self: Sized bound from Shape to methods. ([#340][] by [@waywardmonkeys][])
    • Enabled partial SVG path support in no_std builds. ([#356][] by [@waywardmonkeys][])
    • Deprecated BezPath::flatten, prefer flatten. ([#361][] by [@waywardmonkeys][])

    Fixed

    • An edge case in mindist was fixed. ([#334][] by [@platlas][])
    • Allow lines in simplify input. ([#343][] by [@raphlinus][])
    • Don't skip first dash in dash pattern. ([#353][] by [@dominikh][])
    • Documentation for Arc.perimeter was corrected. ([#354][] by [@simoncozens][])
    • Parsing scientific notation in an SVG path was fixed. ([#365][] by [@GabrielDertoni][])
    Open source →
  7. 0.11.0 14 Feb 2024
    Release notes

    This release has an MSRV of 1.65.

    Note: A changelog was not kept for or before this release

    Open source →
  8. 0.10.4 20 Oct 2023

    Nothing published for this version

  9. 0.10.3 04 Oct 2023

    Nothing published for this version

  10. 0.10.2 03 Oct 2023

    Nothing published for this version

  11. 0.10.1 03 Oct 2023

    Nothing published for this version

  12. 0.9.5 17 May 2023

    Nothing published for this version

  13. 0.9.4 26 Apr 2023

    Nothing published for this version

  14. 0.9.3 12 Apr 2023

    Nothing published for this version

  15. 0.9.2 29 Mar 2023

    Nothing published for this version

  16. 0.9.1 03 Mar 2023

    Nothing published for this version

  17. 0.9.0 23 Nov 2022

    Nothing published for this version

  18. 0.8.3 20 Dec 2021

    Nothing published for this version

  19. 0.8.2 05 Oct 2021

    Nothing published for this version

  20. 0.8.1 28 Mar 2021

    Nothing published for this version

  21. 0.8.0 05 Feb 2021

    Nothing published for this version

  22. 0.7.1 08 Nov 2020

    Nothing published for this version

  23. 0.7.0 20 Oct 2020

    Nothing published for this version

  24. 0.6.3 31 Aug 2020

    Nothing published for this version

  25. 0.6.2 26 Jun 2020

    Nothing published for this version

  26. 0.6.1 28 May 2020

    Nothing published for this version

  27. 0.6.0 11 May 2020

    Nothing published for this version

  28. 0.5.11 17 Mar 2020

    Nothing published for this version

  29. 0.5.10 17 Mar 2020 withdrawn

    Nothing published for this version

  30. 0.5.9 16 Mar 2020 withdrawn

    Nothing published for this version

  31. 0.5.8 29 Jan 2020

    Nothing published for this version

  32. 0.5.7 23 Jan 2020

    Nothing published for this version

  33. 0.5.6 09 Dec 2019

    Nothing published for this version

  34. 0.5.4 01 Nov 2019

    Nothing published for this version

  35. 0.5.3 27 Oct 2019

    Nothing published for this version

  36. 0.5.1 25 Jul 2019

    Nothing published for this version

  37. 0.5.0 22 Jul 2019

    Nothing published for this version

  38. 0.4.0 25 Jun 2019
    Release notes

    Crates.io | Docs

    This release has an MSRV of 1.85.
    It is the first release since polycool was transferred to the Linebender organization.

    Changed

    • Rename Poly::magnitude to Poly::max_abs_coefficient. (#502 by @jneem)

    Fixed

    • Avoid potential underflow in DynPoly::deriv (#502 by @jneem)
    • Avoid NaN during Newton iteration (#502 by @jneem)

    Note: A changelog was not kept before this release

    Full Changelog: v0.12.0...polycool-v0.4.0

    Open source →
  39. 0.3.1 20 Jun 2019

    Nothing published for this version

  40. 0.3.0 20 Jun 2019

    Nothing published for this version

  41. 0.2.3 18 Jun 2019

    Nothing published for this version

  42. 0.2.2 07 May 2019

    Nothing published for this version

  43. 0.2.1 20 Feb 2019

    Nothing published for this version

  44. 0.2.0 11 Jan 2019

    Nothing published for this version

  45. 0.1.2 05 Jan 2019

    Nothing published for this version

  46. 0.1.1 02 Jan 2019

    Nothing published for this version

  47. 0.1.0 27 Dec 2018

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive