NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1287 most downloaded on crates.io
A tiny-skia Bezier path implementation
Last release 8 months ago
02 Feb 2026
Ships unpredictably
gaps range from 8 days to 2.0 years
Nearly every release is documented
notes for 14 of 14 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
14 releases · first in 2022
One column per quarter.
Update version numbers and changelog for v0.12.0 release.
Update version numbers and changelog for v0.12.0 release.
cargo-semver-checks says that tiny-skia-path also requires a
semver-breaking release (and it looks like historically it's version has
been locked to that of tiny-skia anyway), so I've also updated it's
version number.
Signed-off-by: Nico Burns nico@nicoburns.com
RadialGradient).
Thanks to @wmedranoSweepGradient).
Thanks to @wmedranois_empty and join methods to Rect. Thanks to @danieldgHash for PathVerb, Rect and Size and IntSize. Thanks to @LaurenzVfrom_rgba_unchecked method to Color so it can be created in const contexts. Thanks to @jeffreyrosenbluthscale_by and scale_to method to Size. Thanks to @jermytake_demultiplied method to Pixmap. Thanks to @JustForFun88take method to Mask. Thanks to @valadaptiveround_out method to Rect. Thanks to @valadaptiveRadialGradient::new requires a start radius now. Set the second argument
to 0.0 to preserve the old behavior.Path::compute_tight_bounds calculation. Thanks to @qbcbyb
Path::compute_tight_bounds calculation.
Thanks to @qbcbyb### Added - Path::compute_tight_bounds
Path::compute_tight_boundsMSRV bumped to stable, because of the flate2 crate.
flate2 crate.Transform::is_valid was treating 1/4096 as zero. We need a higher precision.--no-default-features.
Thanks to @linkmauveMSRV bumped to 1.60, because of the log crate.
log crate.LineJoin::MiterClip handling with small miter_limit.
Thanks to @torokati44LineJoin::MiterClip. Thanks to @torokati44
LineJoin::MiterClip.
Thanks to @torokati44Rect::inset and Rect::outset are no longer require a mutable self.
Thanks to @wezmColorU8 and PremultipliedColorU8 are stored as [u8; 4] instead of u32. This fixes potential alignment issues and make the code easier to understand. T
PathBuilder::push_pathNonZeroRectSizeRect::transformRect::bbox_transformTransform::from_bboxTransform::is_validTransform::get_scaleTransform::pre_rotateTransform::post_rotateTransform::pre_rotate_atTransform::post_rotate_atTransform::map_pointColorU8 and PremultipliedColorU8 are stored as [u8; 4] instead of u32.
This fixes potential alignment issues
and make the code easier to understand.
Thanks to @e00EPathBuilder::push_rect accepts Rect and not f32 numbers now.tiny_skia_path::ScreenIntRect. It become private.Path::is_empty. Path cannot be empty by design.ColorU8::get and PremultipliedColorU8::get. Use the getters instead.Mask::from_pixmap to convert Pixmap into Mask by extracting alpha or luminance.
Mask::from_vecMask::from_pixmap to convert Pixmap into Mask by extracting alpha or luminance.Mask::widthMask::heightMask::dataMask::data_mutMask::fill_pathMask::decode_pngMask::load_pngMask::encode_pngMask::save_pngMask::invertMaskTypePixmap::apply_maskClipMask into Mask.Mask is closer to a 8bit (A8) Pixmap now, rather than being its own thing.Mask::new requires width and height arguments now.Mask using Mask::fill_path uses our SIMD pipeline now instead of a scalar code
that should make it a bit faster.Option<()>, but simply adds a warning to the log.Paint::anti_alias is set to true by default.Mask::set_path. Use Mask::fill_path instead.Mask::default(). Mask cannot be empty anymore.Implement PartialEq for Paint and subtypes. Thanks to @hecrj
PartialEq for Paint and subtypes. Thanks to @hecrjpng crate.ClipMasks larger than 8191x8191 pixels.
Previously, the creation of a large mask via ClipMask::set_path
would have created an empty mask.Performance regression, probably due to LLVM update in Rust. Thanks to @mostafa-khaled775
Increase Conic to Quad conversion precision. This allows us to produce nicer round caps. Previously, they were not as round as needed.
Pixmap::from_vec.Conditional compilation of FasterMinMax on fallback platforms. Thanks to @CryZe
FasterMinMax on fallback platforms.
Thanks to @CryZeAArch64 Neon SIMD support. Up to 3x faster on Apple M1. Thanks to @CryZe
FiniteF32, NormalizedF32 and NonZeroPositiveF32 types have been moved
to the strict-num crate.NormalizedF32::from_u8 into NormalizedF32::new_u8.NormalizedF32::new_bounded into NormalizedF32::new_clamped.safe_arch.tiny-skia-path dependency that can be used independently from tiny-skia. It contains the tiny-skia Bezier path implementation, including stroking and
tiny-skia-path dependency that can be used independently from tiny-skia.
It contains the tiny-skia Bezier path implementation, including stroking and dashing.
As well as all the geometry primitives (like Point and Rect).std feature, one have to enable no-std-float feature instead of libm now.Your coding agent can read these notes before it upgrades. Set up the MCP server →