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 2026Releases
latest 47-
0.13.113 May 2026Release notes
Open source →This release has an MSRV of 1.85.
Added
Stroke::is_finiteandStroke::is_nan. (#545 by @waywardmonkeys)- Component-wise
Insets::min/maxmethods. (#548 by @xStrom) - Ability to add and subtract
Insetsfrom otherInsets. (#549 by @xStrom) Arcnow implementsParamCurve. (#378 by @waywardmonkeys)Affine::{pre,then}_skewandAffine::{pre,then}_reflectfluent composition helpers. (#563 by @waywardmonkeys)- Three transform matrix norms:
Affine::{nuclear_norm_squared,frobenius_norm_squared,spectral_norm}. (#569 by @tomcur) StrokeOpts::stable_dash_orderto keep dashes at fixed path-relative positions instead of merging the first/last dash across. (#550 by @RobertBrewitz)expand_pathanisotropic path expansion. (#575 by @raphlinus)
Changed
- Improved performance of
RoundedRect::windingandRoundedRect::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_capsare all nowconst. (#536 by @xStrom, #539 and #561 by @tomcur)- Improved performance of
Ellipse::area. Note: for non-finite ellipses, this method may now returnf64::INFINITYwhere it returnedf64::NANbefore. (#559 by @tomcur) - Improved numerical robustness of winding numbers for paths. (#537 by @jneem)
Fixed
Affine::pre_rotate_aboutcalculation. (#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_offsetincreases. (#585 by @Keavon)
New Contributors
- @ztaaha made their first contribution in #554
- @dannymcgee made their first contribution in #567
- @RobertBrewitz made their first contribution in #550
- @Keavon made their first contribution in #585
Full Changelog: v0.13.0...v0.13.1
-
0.13.027 Nov 2025Release notes
Open source →This release has an MSRV of 1.85.
Added
- The newly added
BezPath::into_elementsmethod allows getting all path elements as aVecwithout allocating, consuming the original path. This is the counterpart ofBezPath::from_vec. (#504 by @cmyr) - Add a derive
Hashto theAxistype. (#527 by @jrmoulton)
Changed
- Speed up methods like
Ellipse::radiiby reworking the singular value decomposition expression. (#499 by @tomcur) - The
Line::nearestmethod to calculate the projection of a point onto a line segment has been made more performant. (#505 by @tomcur) - The
QuadBez::arclencalculation has been made more numerically stable (#503 by @jneem). SvgParseErrornow implementscore::error:Error. It previously implementedstd::error::Errorinstd-enabled builds. (#517 by @Bombaninha)- The behavior of open versus closed shapes when using
BezPath::extend(extending Bezier paths using an iterator overPathEl) has been clarified. #523 by @DJMcNab) - More methods are marked
inline. (#506 by @LaurenzV, #509 by @tomcur)
The following functions are now callable from
constcontexts. (#510, #512, #521, #522, #524, #525, #526 by @tomcur)Affine::{skew, then_translate, map_unit_square, as_coeffs, determinant, inverse, translation, with_translation}Point::midpointRect::{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_finiteandis_nanmethods on the following types are nowconst:Affine,Circle,ConstPoint,CubicBez,Ellipse,Insets,Line,Point,QuadBez,Rect,RoundedRect,RoundedRectRadii,Size,Triangle,Vec2.
New Contributors
- @Bombaninha made their first contribution in #517
- @jrmoulton made their first contribution in #527
Full Changelog: v0.12.0...v0.13.0
- The newly added
-
0.12.004 Sep 2025Release notes
Open source →This release has an MSRV of 1.82. It was increased to support floating point math in const functions.
Added
- Newly public
StrokeCtxallows for reusing allocations when stroking multiple paths. (#475 by @LaurenzV) - New
Axistype. (#476 by @PoignardAzur) - Add
Ellipse::major_radiusandEllipse::minor_radiusmethods. (#497 by @tomcur)
Changed
- The implementation of stroking is much faster. (#427 by @raphlinus)
- More
Vec2methods can now be called inconstcontexts. (#479 by @tomcur) aspect_ratioonRectandSizehas been deprecated and replaced withaspect_ratio_width.
This is because the implementation ofaspect_ratioused 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 withinscribed_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::CubicOffsethas 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:
DashIteratorhas been removed. ReplaceDashIterator::newwithdash. (#488 by @DJMcNab) - Breaking change: The previously deprecated
BezPath::flatten,Ellipse::[with_]x_rotation,{Rect, Size}::is_empty,Shape::[in]to_bez_path,
andTranslateScale::as_tuplehave been removed. (#487 by @DJMcNab)
New Contributors
- @PoignardAzur made their first contribution in #476
- @grebmeg made their first contribution in #490
Full Changelog: v0.11.3...v0.12.0
Release notes
Open source →This release has an [MSRV][] of 1.82. It was increased to support floating point math in const functions.
Added
- Newly public
StrokeCtxallows for reusing allocations when stroking multiple paths. ([#475][] by [@LaurenzV][]) Axistype. ([#476][] by [@PoignardAzur][])Ellipse::major_radiusandEllipse::minor_radiusmethods. ([#497][] by [@tomcur][])
Changed
- The implementation of stroking is much faster. ([#427][] by [@raphlinus][])
- More
Vec2methods can now be called inconstcontexts. ([#479][] by [@tomcur][]) aspect_ratioonRectandSizehas been deprecated and replaced withaspect_ratio_width. This is because the implementation ofaspect_ratioused 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 withinscribed_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::CubicOffsethas been removed, and replaced byoffset::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:
DashIteratorhas been removed. ReplaceDashIterator::newwithdash. ([#488][] by [@DJMcNab][]) - Breaking change: The previously deprecated
BezPath::flatten,Ellipse::[with_]x_rotation,{Rect, Size}::is_empty,Shape::[in]to_bez_path, andTranslateScale::as_tuplehave been removed. ([#487][] by [@DJMcNab][])
- Newly public
-
0.11.321 Jul 2025Release notes
Open source →This release has an MSRV of 1.65.
Added
- Add
current_positionmethod toBezPath. (#462 by @sagudev) - Add
Fromconversions betweeneuclidandkurbotypes behind theeuclidfeature. (#463 by @sagudev) - Add Green's theorem moments. (#452 by @simoncozens)
- Make
Vec2::splatpublic. (#469 by @xorgy)
Changed
-
Let more methods take
Into<Point>instead ofPoint. (#466 by @sagudev)Note: this can impact type inference.
-
Inline the
Mul<PathEl>implementation forAffine. (#461 by @LaurenzV) -
Inline the
nextmethod of theToQuadsiterator. (#460 by @LaurenzV) -
Avoid calling
f64::hypot, as it calls a slow library function. (#448 by @beholdnec, #451 by @raphlinus)
Fixed
- Documentation of
RoundedRectno 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
- @beholdnec made their first contribution in #448
- @sagudev made their first contribution in #454
Full Changelog: v0.11.2...v0.11.3
Release notes
Open source →This release has an [MSRV][] of 1.65.
Added
current_positionmethod toBezPath. ([#462][] by [@sagudev][])Fromconversions betweeneuclidandkurbotypes behind theeuclidfeature. ([#463][] by [@sagudev][])- Green's theorem moments. ([#452][] by [@simoncozens][])
- Made
Vec2::splatpublic. ([#469][] by [@xorgy][])
Changed
-
Let more methods take
Into<Point>instead ofPoint. ([#466][] by [@sagudev][])Note: this can impact type inference.
-
Inline the
Mul<PathEl>implementation forAffine. ([#461][] by [@LaurenzV][]) -
Inline the
nextmethod of theToQuadsiterator. ([#460][] by [@LaurenzV][]) -
Avoid calling
f64::hypot, as it calls a slow library function. ([#448][] by [@beholdnec][], [#451][] by [@raphlinus][])
Fixed
- Documentation of
RoundedRectno 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])
- Add
-
0.11.228 Apr 2025Release notes
Open source →0.11.2 (2025-04-28)
This release has an MSRV of 1.65.
Added
Strokeis nowPartialEq,StrokeOptsis nowClone,Copy,Debug,Eq,PartialEq. (#379 by @waywardmonkeys)- Implement
SumforVec2. (#399 by @Philipp-M) - Add triangle shape. (#350 by @juliapaci, #387 by @tomcur)
- Implement
Div<f64>andMul<f64>forInsets. (#384 by @liferooter) - Add
Vec2::turn_90andVec2::rotate_scalemethods (#409 by @raphlinus) - Add
minandmaxmethods toSize. (#412 by @nils-mathieu) - Add an
INFNITYconstant toSize. (#413 by @nils-mathieu) - Add
BezPath::with_capacitymethod (#418 by @LaurenzV) - Add
Affine::scale_aboutandAffine::then_scale_about. (#429 by @xorgy)
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
- Fix documentation of
Affine::svd. (#388 by @tomcur) - Fix documentation of cross product. (#409 by @raphlinus)
New Contributors
- @juliapaci made their first contribution in #350
- @tomcur made their first contribution in #383
- @Philipp-M made their first contribution in #399
- @liferooter made their first contribution in #384
- @LaurenzV made their first contribution in #418
- @xorgy made their first contribution in #429
Full Changelog: v0.11.1...v0.11.2
Release notes
Open source →This release has an [MSRV][] of 1.65.
Added
Strokeis nowPartialEq,StrokeOptsis nowClone,Copy,Debug,Eq,PartialEq. ([#379][] by [@waywardmonkeys][])- Implemented
SumforVec2. ([#399][] by [@Philipp-M][]) - Triangle shape. ([#350][] by [@juliapaci][], [#387][] by [@tomcur][])
- Implemented
Div<f64>andMul<f64>forInsets. ([#384][] by [@liferooter][]) Vec2::turn_90andVec2::rotate_scalemethods ([#409][] by [@raphlinus][])minandmaxmethods toSize. ([#412][] by [@nils-mathieu][])INFNITYconstant toSize. ([#413][] by [@nils-mathieu][])BezPath::with_capacitymethod ([#418][] by [@LaurenzV][])Affine::scale_aboutandAffine::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][])
-
0.11.112 Sep 2024Release notes
Open source →0.11.1 (2024-09-12)
This release has an MSRV of 1.65.
Added
- Add
From (f32, f32)forPoint. (#339 by @rsheeter) - Add
Rect::overlapsandRect::contains_rect. (#347 by @nils-mathieu) - Add
CubicBez::tangents(#288 by @raphlinus) - Add
Arc::reversed. (#367 by @waywardmonkeys) - Add
CircleSegment::inner_arcandCircleSegment::outer_arc(#368 by @waywardmonkeys) - Add
Rect::is_zero_areaandSize::is_zero_areaand deprecate theiris_emptymethods. (#370 by @waywardmonkeys) - Add
Line::reversedandLine::midpoint. (#375 by @waywardmonkeys) - Allow construction of
Linefrom(Point, Point)and(Point, Vec2). (#376 by @waywardmonkeys)
Changed
- Move
Self: Sizedbound fromShapeto methods. (#340 by @waywardmonkeys) - Enable partial SVG path support in
no_stdbuilds. (#356 by @waywardmonkeys) - Deprecate
BezPath::flatten, preferflatten. (#361 by @waywardmonkeys)
Fixed
- An edge case in
mindistwas 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.perimeterwas corrected. (#354 by @simoncozens) - Parsing scientific notation in an SVG path was fixed. (#365 by @GabrielDertoni)
New Contributors
- @nils-mathieu made their first contribution in #347
- @GabrielDertoni made their first contribution in #365
- @dominikh made their first contribution in #353
Full Changelog: v0.11.0...v0.11.1
Release notes
Open source →This release has an [MSRV][] of 1.65.
Added
From (f32, f32)forPoint. ([#339][] by [@rsheeter][])Rect::overlapsandRect::contains_rect. ([#347][] by [@nils-mathieu][])CubicBez::tangents([#288][] by [@raphlinus][])Arc::reversed. ([#367][] by [@waywardmonkeys][])CircleSegment::inner_arcandCircleSegment::outer_arc([#368][] by [@waywardmonkeys][])Rect::is_zero_areaandSize::is_zero_areaand deprecate theiris_emptymethods. ([#370][] by [@waywardmonkeys][])Line::reversedandLine::midpoint. ([#375][] by [@waywardmonkeys][])- Allowing construction of
Linefrom(Point, Point)and(Point, Vec2). ([#376][] by [@waywardmonkeys][])
Changed
- Moved
Self: Sizedbound fromShapeto methods. ([#340][] by [@waywardmonkeys][]) - Enabled partial SVG path support in
no_stdbuilds. ([#356][] by [@waywardmonkeys][]) - Deprecated
BezPath::flatten, preferflatten. ([#361][] by [@waywardmonkeys][])
Fixed
- An edge case in
mindistwas 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.perimeterwas corrected. ([#354][] by [@simoncozens][]) - Parsing scientific notation in an SVG path was fixed. ([#365][] by [@GabrielDertoni][])
- Add
-
0.11.014 Feb 2024Release notes
Open source →This release has an MSRV of 1.65.
Note: A changelog was not kept for or before this release
-
0.10.420 Oct 2023Nothing published for this version
-
0.10.304 Oct 2023Nothing published for this version
-
0.10.203 Oct 2023Nothing published for this version
-
0.10.103 Oct 2023Nothing published for this version
-
0.9.517 May 2023Nothing published for this version
-
0.9.426 Apr 2023Nothing published for this version
-
0.9.312 Apr 2023Nothing published for this version
-
0.9.229 Mar 2023Nothing published for this version
-
0.9.103 Mar 2023Nothing published for this version
-
0.9.023 Nov 2022Nothing published for this version
-
0.8.320 Dec 2021Nothing published for this version
-
0.8.205 Oct 2021Nothing published for this version
-
0.8.128 Mar 2021Nothing published for this version
-
0.8.005 Feb 2021Nothing published for this version
-
0.7.108 Nov 2020Nothing published for this version
-
0.7.020 Oct 2020Nothing published for this version
-
0.6.331 Aug 2020Nothing published for this version
-
0.6.226 Jun 2020Nothing published for this version
-
0.6.128 May 2020Nothing published for this version
-
0.6.011 May 2020Nothing published for this version
-
0.5.1117 Mar 2020Nothing published for this version
-
0.5.1017 Mar 2020 withdrawnNothing published for this version
-
0.5.916 Mar 2020 withdrawnNothing published for this version
-
0.5.829 Jan 2020Nothing published for this version
-
0.5.723 Jan 2020Nothing published for this version
-
0.5.609 Dec 2019Nothing published for this version
-
0.5.401 Nov 2019Nothing published for this version
-
0.5.327 Oct 2019Nothing published for this version
-
0.5.125 Jul 2019Nothing published for this version
-
0.5.022 Jul 2019Nothing published for this version
-
0.4.025 Jun 2019Release notes
Open source →This release has an MSRV of 1.85.
It is the first release sincepolycoolwas transferred to the Linebender organization.Changed
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
- Avoid potential underflow in
-
0.3.120 Jun 2019Nothing published for this version
-
0.3.020 Jun 2019Nothing published for this version
-
0.2.318 Jun 2019Nothing published for this version
-
0.2.207 May 2019Nothing published for this version
-
0.2.120 Feb 2019Nothing published for this version
-
0.2.011 Jan 2019Nothing published for this version
-
0.1.205 Jan 2019Nothing published for this version
-
0.1.102 Jan 2019Nothing published for this version
-
0.1.027 Dec 2018Nothing published for this version