Changelog

Unreleased

This release has an MSRV of 1.89.

0.3.0 - 2026-10-02

This release has an MSRV of 1.89.

Added

  • TargetInit<C> for configuring target clears or compositing over existing contents. (#1866 by @LaurenzV)
  • Public pixmap::premultiply_rgba8 and unpremultiply_rgba8 helpers. (#1930 by @LaurenzV)
  • ImageSource::external_texture for external GPU texture paints. (#1824 by @LaurenzV)
  • Support for ImageSampler::alpha. (#1880 by @LaurenzV)
  • Rectangular clip support in ClipContext, ClipState, and ViewportState. (#1916, #1926 by @LaurenzV)

Changed

  • Breaking change: Unified pixmap construction in Pixmap::from_parts, which now accepts Vec<u8> and PixelMetadata. (#1834 by @LaurenzV)
  • Breaking change: Replaced Pixmap::take and take_unpremultiplied with take_rgba8 and try_take_rgb8, adding RGB output support. (#1855 by @LaurenzV)
  • Breaking change: Atlas sizes, allocation dimensions, and image-cache offsets now use u16; the OffsetU32, SizeU32, and RectU32 geometry types have been removed. (#1826 by @LaurenzV)
  • Breaking change: Updated fearless_simd to v0.7.0 and adapted the SIMD utility APIs. (#1853 by @LaurenzV)
  • Breaking change: ClipContext, ClipState, and ViewportState rename push_clip to push_clip_path, and their clip accessors now return ClipRef instead of PathDataRef. (#1916, #1926 by @LaurenzV)
  • Breaking change: Probe APIs now support configurable features, depth-buffer testing, and per-cell statistics. (#1901, #1908 by @LaurenzV)
  • Breaking change: EncodeExt::encode_into now returns Option<Paint>. (#1949 by @grebmeg)

Removed

  • Breaking change: EncodedExternalTexture. (#1824 by @LaurenzV)
  • Breaking change: ImageCache::allocate_excluding and MultiAtlasManager::try_allocate_excluding. (#1825 by @LaurenzV)

Fixed

  • Gradient cache collisions between premultiplied and unpremultiplied alpha interpolation. (#1932 by @LaurenzV)
  • Color conversions on big-endian targets. (#1845 by @LaurenzV)

Optimized

0.2.0 - 2026-08-07

This release has an MSRV of 1.88.

Added

  • ProbeResult::statistics, ProbeStatistics, and ProbeFeature for diagnosing which renderer-probe features and pixels differ from the reference output. (#1779 by @LaurenzV)
  • PROBE_ELEMENTS for inspecting the active features used by the shared probe scene. (#1801 by @LaurenzV)

Changed

  • Breaking change: AtlasError variants now report configured limits and allocation sizes, with the new AtlasSpaceDiagnostics and AtlasLayerDiagnostics types providing per-layer free-space, utilization, and fragmentation details. (#1778 by @grebmeg)

0.1.0 - 2026-07-29

This release has an MSRV of 1.88.

Added

  • FilterPrimitive::DropShadowOnly for rendering a drop shadow without compositing the original input over it. (#1763 by @LaurenzV)
  • Support for inverse blurred rounded rectangles, enabling inset box shadows in the renderer crates. (#1715 by @nicoburns)

Changed

  • Breaking change: Filter bounds now distinguish the output expansion from the source expansion required to compute a filter. The bounds_expansion APIs have been replaced by filter_expansion and source_expansion. (#1701 by @LaurenzV)
  • Breaking change: Filter padding now uses the new PaddingU16 type, RectU16::intersect no longer produces inverted rectangles, and strip_bbox now returns Option<RectU16>. (#1751 by @LaurenzV)

Removed

  • Breaking change: The old coarse rasterizer and render graph, including the public coarse and render_graph modules. The rewritten CPU and hybrid renderers no longer use them. (#1762 by @LaurenzV)

Fixed

  • Opaque image rendering when blend modes or masks are active. (#1697 by @LaurenzV)
  • Gaussian blur strength changing abruptly at decimation thresholds. (#1720 by @grebmeg)
  • Fast rectangle rendering at the maximum u16 coordinates. (#1666 by @dipeshbabu)

Optimized

  • Clip-path intersection by skipping rows outside the paths' shared vertical extent and locating the first relevant strip with binary search. (#1690, #1691 by @LaurenzV)
  • Gradient lookup-table generation. (#1726 by @LaurenzV)
  • x86 rendering, including blending and high-quality image sampling, through improved SIMD code generation. (#1688 by @LaurenzV)
  • Rendering opaque peniko::ImageData by computing and retaining its transparency hint during conversion. (#1760 by @tronical)
  • Filter processing for drop shadows by tightening their source and output bounds. (#1768 by @LaurenzV)

0.0.9 - 2026-05-30

This release has an MSRV of 1.88.

Fixed

Optimized

  • Tiling of line segments fully contained in the viewport. (#1635 by @LaurenzV)

0.0.8 - 2026-05-15

This release has an MSRV of 1.88.

Added

  • TextureId, a handle for user-provided textures resolved at render-time, and EncodedExternalTexture for encoding draws that sample from them. (#1552 by @tomcur)
  • RectU16, a shared axis-aligned rectangle type for u16 coordinate bounding boxes. (#1559 by @tomcur)

Changed

  • WideTilesBbox now uses RectU16 internally, its bbox field is private, and WideTilesBbox::new now takes four u16 coordinates instead of a [u16; 4]. (#1559 by @tomcur)
  • Renamed image transparency hint APIs from may_have_opacities and *_opacity_hint to may_have_transparency and *_transparency_hint. (#1613 by @upsuper)
  • Gradient LUTs no longer reserve an extra transparent entry for undefined radial-gradient regions; EncodedGradient now tracks whether those regions are possible. (#1529 by @LaurenzV)

Removed

  • Public glyph and colr modules and the text feature; sparse-strips text rendering now lives in glifo and the renderer crates. (#1562 by @LaurenzV)
  • Support for recordings, including the shared recording API. This decision was made due to a number of downsides that came with the implementation. See the corresponding PR and Zulip thread for more information. (#1611 by @LaurenzV)

Fixed

  • Handling of zero-area rectangles in the rectangle fast path, avoiding out-of-viewport strips and downstream assertions. (#1537 by @LaurenzV)
  • Invalid gradients with NaN or out-of-range final stop offsets now fall back to the first color instead of passing validation. (#1531 by @LaurenzV)
  • Implicit subpaths that continue after ClosePath without an explicit MoveTo. (#1544 by @tomcur)
  • Negative-sized rectangles during strip generation. (#1589 by @LaurenzV)

Optimized

  • Rendering performance for paths with line segments fully or partly left of the viewport by culling invisible left-of-viewport line work while preserving winding contributions. (#1368 by @b0nes164)
  • Performance of clipped drawing by culling geometry outside the clip bounding box during flattening. (#1519 by @tomcur)
  • Flattening and tiling performance through codegen improvements in the sparse strip pipeline. (#1600, #1616, #1634 by @LaurenzV)

0.0.7 - 2026-03-24

This release has an MSRV of 1.92.

Added

Changed

  • Replaced custom blend mode representation with peniko Mix for filter effects. (#1410 by @LaurenzV)

Removed

Fixed

Optimized

  • Bézier flattening performance by catching more Béziers whose chords are immediately within rendering tolerance. (#1216 by @tomcur)
  • Flattening and tiling performance by culling out-of-viewport Béziers before flattening. (#1341 by @tomcur)
  • Rendering performance of scenes including blend layers by ensuring no commands are generated for wide tiles without layer content. (#1403 by @tomcur)
  • Scenes including blend layers by only allocating layer scratch buffers for a wide tile upon draw commands being performed in that wide tile. (#1414 by @tomcur)
  • Analytic anti-aliasing. (#1426, #1442 by @tomcur)
  • Filter application to layers. (#1444 by @LaurenzV)
  • Rendering pixel-aligned rectangles. (#1453 by @grebmeg)
  • Coarse rasterization and scheduling of scenes without layers. (#1454 by @LaurenzV)
  • Resetting wide tiles. (#1484 by @LaurenzV)

0.0.6 - 2026-01-15

This release has an MSRV of 1.88.

Changed

Optimized

See also the vello_hybrid 0.0.6 and vello_cpu 0.0.6 releases.

0.0.5 - 2026-01-08

This release has an MSRV of 1.88.

Added

  • A new module clip allowing for the possibility to intersect two strips to create a new strip representing their intersection. (#1203 by @LaurenzV)
  • An extend method to StripStorage to extend its alphas/strips from another StripStorage. (#1203 by @LaurenzV)
  • A new trait for approximate integer division by 255. (#1203 by @LaurenzV)
  • A from_parts method for masks. (#1237 by @LaurenzV)
  • Initial support for image filters. (#1286 by @grebmeg)

Changed

  • WideTile::generate now takes an additional BlendMode as a parameter. (#1159 by @LaurenzV)
  • CmdFill and CmdAlphaFill now store a BlendMode instead of Option<BlendMode>. (#1159 by @LaurenzV)
  • Strip now implements PartialEq and Eq. (#1203 by @LaurenzV)
  • Strip now has a is_sentinel method. (#1203 by @LaurenzV)
  • StripStorage now implements PartialEq and Eq. (#1203 by @LaurenzV)
  • The generate_filled_path method of StripGenerator now takes an optional clip path as input. (#1203 by @LaurenzV)
  • The generate method of Wide now takes an optional mask as an additional argument. (#1237 by @LaurenzV)
  • CmdFill and CmdAlphaFill now store an optional mask. (#1237 by @LaurenzV)
  • Various changes to the logic for computing tile intersections and representation of tiles. (#1293, #1317, #1318 by @b0nes164)
  • Support for computing data necessary to implement multi-sampled anti-aliasing. (#1319, by @b0nes164)

Optimized

See also the vello_hybrid 0.0.5 and vello_cpu 0.0.5 releases.

0.0.4 - 2025-10-17

This release has an MSRV of 1.86.

No changelog was kept for this release.

See also the vello_hybrid 0.0.4 and vello_cpu 0.0.4 releases.

0.0.3 - 2025-10-04

This release has an MSRV of 1.86.

No changelog was kept for this release.

See also the vello_cpu 0.0.3 release.

0.0.2 - 2025-09-22

This release has an MSRV of 1.85.

No changelog was kept for this release.

See also the vello_cpu 0.0.2 release.

0.0.1 - 2025-05-10

This release has an MSRV of 1.85.

This is the initial release. No changelog was kept for this release.

See also the vello_cpu 0.0.1 release.