NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1314 most downloaded on crates.io
A tiny Skia subset ported to Rust.
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 30 of 30 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
30 releases · first in 2020
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.Reexport tiny_skia_path::PathStroker in tiny-skia.
tiny_skia_path::PathStroker in tiny-skia.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.Panic in Rect::round and Rect::round_out. Thanks to @Wardenfar
Rect::round and Rect::round_out.
Thanks to @Wardenfar### Fixed - Minimum arrayref version.
arrayref version.Panic during non-aliased hairline stroking at the bottom edge of an image.
SourceOver blend mode must not be optimized to Source when ClipPath is present.
ClipMask::intersect_path alpha multiplying.
ClipMask::intersect_path alpha multiplying.Support rendering on pixmaps larger than 8191x8191 pixels. From now, Pixmap is limited only by the amount of memory caller has.
Pixmap is limited only by the amount of memory caller has.Transform::map_pointsPathBuilder::push_ovalWASM simd128 support. Thanks to @CryZe
Transform::post_scale no longer requires &mut self.png crate.Color memset optimizations should be ignored when clip mask is present.
ClipMask::intersect_path logic.no_std support. Thanks to @CryZe
ClipMask::intersect_pathTransform strictness. It's no longer guarantee to have only finite values,
therefore we don't have to check each operation.Canvas. Call Pixmap/PixmapMut drawing methods directly.Panic during path filling with anti-aliasing because of incorrect edges processing.
Endless loop during stroke dashing.
Remove almost all unsafe. No performance changes.
unsafe. No performance changes.PixmapRef and PixmapMut, that can be created from Pixmap or from raw data.
PixmapRef and PixmapMut, that can be created from Pixmap or from raw data.Canvas::set_clip_mask, Canvas::get_clip_mask, Canvas::take_clip_mask.Canvas no longer owns a Pixmap.Canvas::draw_pixmap and Pattern::new accept PixmapRef instead of &Pixmap now.ClipMask type become public.Pixmap bounds.Canvas::new### Changed - Port to Rust.
Bindings to a stripped down Skia fork.
Your coding agent can read these notes before it upgrades. Set up the MCP server →