Skip to content

Releases: linebender/vello

v0.9.0

15 May 16:19
875f324

Choose a tag to compare

Crates.io | Docs

This release has an MSRV of 1.88.

Added

  • Breaking change in vello_encoding: GlyphRun now has a font_embolden field. Use FontEmbolden::default() to preserve the previous behavior. vello now re-exports FontEmbolden and exposes DrawGlyphs::font_embolden for synthetic font emboldening. (#1628 by @jrmoulton)
  • Breaking change in vello_encoding: GlyphRun now has a brush_transform field. Use None to preserve the previous behavior. vello now exposes DrawGlyphs::brush_transform for transforming gradient and image brush contents independently from glyph geometry. (#1632 by @waywardmonkeys)

Changed

  • Breaking change: wgpu has been updated to v29. (#1534 by @nicoburns)
  • Updated peniko to v0.6.1, which also updates kurbo to v0.13.1 and color to v0.3.3. (#1643 by @waywardmonkeys)
  • Updated skrifa to v0.42, adding support for VARC glyphs. (#1594 by @nicoburns and @oscargus)
  • ImageQuality::High now uses bicubic image sampling. (#1557 by @waywardmonkeys)
  • Image atlas residency is now preserved across renders, avoiding repeated atlas rebuilds and uploads for images that are already resident. (#1558 by @waywardmonkeys)

Fixed

  • Blurry image rendering due to incorrect half-pixel offset. (#1606 by @Keavon and @xStrom)
  • Inactive clip_leaf shader lanes no longer perform invalid shared-memory reads, fixing black frames for some clip-layer scenes on Android/Vulkan. (#1637 by @gugutu)
  • Override image atlas entries are now marked dirty when override textures are inserted, removed, or explicitly refreshed with Renderer::mark_override_image_dirty. (#1638 by @waywardmonkeys and @raphlinus)

This release also coincides with the release of v0.9.0 of Vello Shaders:

Crates.io | Docs

and Vello Encoding:

Crates.io | Docs

New Contributors

Full Changelog: v0.8.0...v0.9.0

Glifo v0.1.0

15 May 16:04
875f324

Choose a tag to compare

Crates.io | Docs

This release has an MSRV of 1.88.

The first release of Glifo!

Glifo is experimental and under rapid development. It aims to provide APIs for efficiently rendering glyphs and paint styles like underline.

Glifo moved to the Vello repo in #1539 and was prepared for release by @conor-93, @grebmeg, @jrmoulton, @LaurenzV, @nicoburns, @oscargus, @taj-p, and @xStrom.

Full Changelog: 246912a...glifo-v0.1.0

Sparse Strips v0.0.8

15 May 16:14
875f324

Choose a tag to compare

Sparse Strips v0.0.8 Pre-release
Pre-release

The 8th alpha version of the Vello Sparse Strips renderers (version 0.0.8) has been released.

This release has an MSRV of 1.88.
You can also follow the roadmap for Vello Sparse Strips.

Vello CPU

Vello CPU is our 2d renderer which doesn't use a GPU.
The imaging model exposed by Vello CPU is very similar to that of current Vello.
Crates.io | Docs

This implementation is now broadly usable, with a reasonably complete imaging model and competitive performance.
It does not however have any API stability guarantees, as we intend to redesign the API to be consistent across the Vello renderers.
Performance information can be seen at https://laurenzv.github.io/vello_chart/ (although note that this URL is not "time-locked", so might shows results from a slightly newer or older version than this tag).

Added

  • render_decoration on glyph run builders for rendering text decorations with skip-ink behavior. (#1592 by @taj-p)
  • Support for rendering VARC glyphs in text paths. (#1594 by @nicoburns, @oscargus)
  • Support for synthetic font emboldening in text glyph runs via GlyphRunBuilder::font_embolden and glifo::FontEmbolden. (#1628 by @jrmoulton)

Changed

  • Migrated text rendering to glifo; rendering, glyph, and image APIs now use an explicit Resources object for persistent image and glyph caches. RenderContext::render_to_buffer, RenderContext::render_to_pixmap, RenderContext::composite_to_pixmap_at_offset, and RenderContext::glyph_run now take resources, and image registration moved from RenderContext to Resources. (#1562 by @LaurenzV)
  • Renamed image transparency hint APIs from may_have_opacities and *_opacity_hint to may_have_transparency and *_transparency_hint. (#1613 by @upsuper)

Removed

  • Experimental vello_api integration and api module. (#1602 by @waywardmonkeys)
  • Support for recordings.
    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

  • Rendering of rare degenerate radial gradients with undefined regions, which should render those regions transparent. (#1529 by @LaurenzV)
  • Incorrect rendering of filter layers containing nested clip layers. (#1541 by @LaurenzV)
  • x86 artifacts in bicubic image rendering caused by negative interpolated color values wrapping during SIMD f32 to u8 conversion. (#1563 by @LaurenzV)
  • Stroked glyph rendering when scaled glyph runs absorb the transform into the font size, preserving the expected stroke width. (#1576 by @LaurenzV)
  • COLR glyph rendering, including glyphs using non-default blend modes. (#1584 by @LaurenzV)
  • Rendering of inverted rectangles, including blurred rounded rectangles. (#1589 by @LaurenzV)

Optimized

  • CPU fine rasterization performance through improved SIMD codegen. (#1616 by @LaurenzV)

Vello Hybrid

This release is a minor release of Vello Hybrid, which uses the CPU for preprocessing and the GPU for rasterization. The imaging model exposed by Vello Hybrid is very similar to that of current Vello.
Crates.io | Docs

This implementation is in its early stages and does not yet provide any API stability guarantees (see the roadmap for more details). It also doesn’t have feature parity with Vello CPU. A few known issues remain, which we plan to address soon.

Added

  • Support for sampling from external textures through Scene::draw_texture_rects. (#1552 by @tomcur)

    This method can sample many regions from a texture at once, allowing the texture to be used as an atlas.
    You bind the textures at render-time (as opposed to scene-construction time), allowing drawing of quickly-changing textures without interning them into the renderer.

    External textures are not yet supported by the webgl backend.

  • Bicubic image sampling in the sparse shader path, improving high-quality image rendering. (#1557 by @waywardmonkeys)

  • WebGlRenderer::probe behind the probe feature to sanity-check WebGL device compatibility by rendering a small reference scene and comparing the output. (#1596 by @LaurenzV)

  • render_decoration on glyph run builders for rendering text decorations with skip-ink behavior. (#1592 by @taj-p)

  • Support for rendering VARC glyphs in text paths. (#1594 by @nicoburns, @oscargus)

  • Support for synthetic font emboldening in text glyph runs via GlyphRunBuilder::font_embolden and glifo::FontEmbolden. (#1628 by @jrmoulton)

Changed

  • Updated wgpu to v29. (#1534 by @nicoburns)
  • Migrated text rendering to glifo; renderer resources are now managed through Resources, which must be passed to text, image upload, and render operations such as Scene::glyph_run, Renderer::render, and Renderer::upload_image. (#1562 by @LaurenzV)
  • Renamed image transparency hint APIs from may_have_opacities and *_opacity_hint to may_have_transparency and *_transparency_hint. (#1613 by @upsuper)
  • Renderer::destroy_image and WebGlRenderer::destroy_image now take &mut Resources instead of &mut ImageCache, allowing clients to destroy images through the public resource container. (#1580 by @LaurenzV)
  • TextureBindings now owns wgpu::TextureViews, allowing bindings to be held across frames more easily.
    insert now takes a TextureView by value and remove returns the removed view if present. (#1639 by @tomcur)

Removed

  • Experimental vello_api integration and api module. (#1602 by @waywardmonkeys)
  • Support for recordings.
    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

  • Rendering of rare degenerate radial gradients with undefined regions, which should render those regions transparent. (#1529 by @LaurenzV)
  • Incorrect rendering of filter layers containing nested clip layers. (#1541 by @LaurenzV)
  • Incorrect rendering when a background-clearing optimization ran after filter layers had been used. (#1526 by @LaurenzV)
  • SceneConstraints::default_blending_only() now allows non-default blend modes inside nested layers, while still rejecting them on the root layer. (#1554 by @LaurenzV)
  • Draw ordering for fast-path strips scheduled after nested layers when default blending constraints are enabled. (#1555 by @LaurenzV, @taj-p)
  • Atlas configuration is now clamped to backend device limits, allowing RenderSettings::default() and oversized atlas settings to work on more devices. (#1568 by @LaurenzV)
  • wgpu render targets are cleared before drawing, fixing stale pixels in transparent or untouched regions when rendering into reused offscreen targets. (#1572 by @waywardmonkeys)
  • Bicubic image sampling now clamps sparse shader results correctly, avoiding invalid premultiplied color values. (#1573 by @waywardmonkeys)
  • Stroked glyph rendering when scaled glyph runs absorb the transform into the font size, preserving the expected stroke width. (#1576 by @LaurenzV)
  • COLR glyph rendering, including glyphs using non-default blend modes. (#1584 by @LaurenzV)
  • WebGlRenderer construction no longer leaks framebuffer state, fixing a panic when creating a second WebGL renderer. (#1603 by @LaurenzV)
  • Blur and filter shader compatibility on some mobile GPUs. (#1601, #1612 by @LaurenzV)
  • Feature gating so probe no longer enables std, and std no longer implies wgpu, preserving WebGL-only configurations. (#1614 by @LaurenzV)

Optimized

  • Native WebGL rendering now avoids an intermediate framebuffer, improving performance especially for low-complexity scenes. (#1546 by @LaurenzV)
  • Rectangle rendering, including large anti-aliased rectangles, clipped axis-aligned fill_rect calls, and blurred rounded rectangles. (#1565, #1586 by @LaurenzV, #1610 by @waywardmonkeys)
  • Filter rendering by applying scissor rectangles to filter passes and intermediate layers. (#1566, #1567 by @LaurenzV)
  • Rendering of opaque strips by adding a front-to-back opaque pass with depth testing to reduce overdraw. (#1577 by @taj-p)

Vello Common

This release also contains Vello Common, a support crate used by Vello CPU and Vello Hybrid.
Crates.io | Docs

Vello Common itself does not currently have any stable API surface, as it is only an implementation detail of Vello CPU and Vello Hybrid.

Vello Sparse Shaders

This release also contains Vello Sparse Shaders, a support crate used by Vello Hybrid.
Crates.io | Docs

This crate also does not currently have any public API surface.

New Contributors

Full Changelog: sparse-strips-v0.0.7...sparse-strips-v0.0.8

Sparse Strips v0.0.7

24 Mar 18:50
6a8d981

Choose a tag to compare

Sparse Strips v0.0.7 Pre-release
Pre-release

The 7th alpha version of the Vello Sparse Strips renderers (version 0.0.7) has been released.

This release has an MSRV of 1.92.
You can also follow the roadmap for Vello Sparse Strips.

Vello CPU

Vello CPU is our 2d renderer which doesn't use a GPU.
The imaging model exposed by Vello CPU is very similar to that of current Vello.
Crates.io | Docs

This implementation is now broadly usable, with a reasonably complete imaging model and competitive performance.
It does not however have any API stability guarantees, as we intend to redesign the API to be consistent across the Vello renderers.
Performance information can be seen at https://laurenzv.github.io/vello_chart/ (although note that this URL is not "time-locked", so might shows results from a slightly newer or older version than this tag).

Added

  • composite_to_pixmap_at_offset method to RenderContext for compositing at specific offsets within a larger pixmap. (#1416 by @grebmeg)
  • ImageResolver for resolving opaque image IDs at rasterization time. (#1451 by @grebmeg)
  • Support for image tinting. (#1460 by @grebmeg)

Fixed

  • Rendering of blurred rounded rectangles with zero or very small blur standard deviations. (#1422 by @tomcur)
  • Off-by-one error in gaussian blur decimation filter. (#1488 by @LaurenzV)
  • Filter layers with zero clips. (#1437 by @LaurenzV)

Optimized

  • Bilinear image sampling in the RenderMode::OptimizeQuality (f32) pipeline. (#1343 by @tomcur)

Vello Hybrid

This release is a minor release of Vello Hybrid, which uses the CPU for preprocessing and the GPU for rasterization. The imaging model exposed by Vello Hybrid is very similar to that of current Vello.
Crates.io | Docs

This implementation is in its early stages and does not yet provide any API stability guarantees (see the roadmap for more details). It also doesn’t have feature parity with Vello CPU. A few known issues remain, which we plan to address soon.

Added

  • Initial support for filter effects. (#1494 by @LaurenzV)
  • render_to_atlas and write_to_atlas APIs for glyph caching. (#1458 by @grebmeg)
  • push_blend_layer, push_opacity_layer and push_mask_layer methods to Scene. (#1420 by @grebmeg)
  • Scene constraints for conditionally achieving better rendering performance. (#1476 by @taj-p)
  • Support for image tinting. (#1460 by @grebmeg)

Changed

Fixed

  • Rendering artifacts sometimes present along the seam in sweep gradients by improving numerical robustness around the seam. (#1352 by @tomcur)
  • Incorrect handling of scenes with many complex paints. (#1467 by @taj-p)

Optimized

Vello Common

This release also contains Vello Common, a support crate used by Vello CPU and Vello Hybrid.
Crates.io | Docs

Vello Common itself does not currently have any stable API surface, as it is only an implementation detail of Vello CPU and Vello Hybrid.

Vello Sparse Shaders

This release also contains Vello Sparse Shaders, a support crate used by Vello Hybrid.
Crates.io | Docs

This crate also does not currently have any public API surface.

Full Changelog: sparse-strips-v0.0.6...sparse-strips-v0.0.7

v0.8.0

20 Mar 13:16
302fa90

Choose a tag to compare

Crates.io | Docs

This release has an MSRV of 1.92.

Changed

  • Breaking change: wgpu has been updated to v28. (#1492 by @xStrom)

This release also coincides with the release of v0.8.0 of Vello Shaders:

Crates.io | Docs

and Vello Encoding:

Crates.io | Docs

Full Changelog: v0.7.0...v0.8.0

Sparse Strips v0.0.6

15 Jan 11:40
ead95f0

Choose a tag to compare

Sparse Strips v0.0.6 Pre-release
Pre-release

The 6th alpha version of the Vello Sparse Strips renderers (version 0.0.6) has been released.

This release has an MSRV of 1.88.
You can also follow the roadmap for Vello Sparse Strips.

Vello CPU

Vello CPU is our 2d renderer which doesn't use a GPU.
The imaging model exposed by Vello CPU is very similar to that of current Vello.
Crates.io | Docs

This implementation is now broadly usable, with a reasonably complete imaging model and competitive performance.
It does not however have any API stability guarantees, as we intend to redesign the API to be consistent across the Vello renderers.
Performance information can be seen at https://laurenzv.github.io/vello_chart/ (although note that this URL is not "time-locked", so might shows results from a slightly newer or older version than this tag).

Added

Changed

Vello Hybrid

This release is a minor release of Vello Hybrid, which uses the CPU for preprocessing and the GPU for rasterization. The imaging model exposed by Vello Hybrid is very similar to that of current Vello.
Crates.io | Docs

This implementation is in its early stages and does not yet provide any API stability guarantees (see the roadmap for more details). It also doesn’t have feature parity with Vello CPU. A few known issues remain, which we plan to address soon.

Changed

Vello Common

This release also contains Vello Common, a support crate used by Vello CPU and Vello Hybrid.
Crates.io | Docs

Vello Common itself does not currently have any stable API surface, as it is only an implementation detail of Vello CPU and Vello Hybrid.

Vello Sparse Shaders

This release also contains Vello Sparse Shaders, a support crate used by Vello Hybrid.
Crates.io | Docs

This crate also does not currently have any public API surface.

New Contributors

Full Changelog: sparse-strips-v0.0.5...sparse-strips-v0.0.6

v0.7.0

13 Jan 17:49
5779e81

Choose a tag to compare

Crates.io | Docs

This release has an MSRV of 1.88.

Changed

  • Breaking change: wgpu has been updated to wgpu 27. (#1280 by @theoparis)
    This has been chosen to match the version used by the upcoming Bevy 0.18.
    (Note that we do not guarantee that our latest release will always match Bevy's wgpu version.)
  • Breaking change: Allow setting Scene layer clip shape drawing style, adding even-odd filled path clipping and stroked path clipping to the various scene layer methods (Scene::{push_layer, push_luminance_mask_layer, push_clip_layer}). (#1332 by @waywardmonkeys, #1342 by @tomcur)
    When pushing a layer, you should use Fill::NonZero as the clip draw style to achieve the same behavior as previous versions.
  • Breaking change: Updated Peniko to v0.6.0. (#1349 by @DJMcNab)
    • This also updates Kurbo to v0.13.0.

Fixed

  • Bitmap emoji displayed at an incorrect position when scaled. (#1273 by @ArthurCose)
  • Miter joins for path segments with near-parallel endpoint tangents no longer cause rendering artifacts. (#1323 by @Cupnfish and @tomcur)

This release also coincides with the release of v0.7.0 of Vello Shaders:

Crates.io | Docs

and Vello Encoding:

Crates.io | Docs

New Contributors

Full Changelog: v0.6.0...v0.7.0

sparse-strips-v0.0.5

08 Jan 15:16
afe3ce3

Choose a tag to compare

sparse-strips-v0.0.5 Pre-release
Pre-release

The 5th alpha version of the Vello Sparse Strips renderers (version 0.0.5) has been released.
We expect to follow-up with v0.1.0 in the near future.
You can track this in #vello > Vello CPU v0.1 release.

This release has an MSRV of 1.88.

Here’s the roadmap for Vello Sparse Strips.

We’ve added CHANGELOG.md files to all the crates listed below.

Vello Common

This release contains Vello Common, a support crate used by Vello CPU and Vello Hybrid.
Crates.io | Docs

Vello Common itself does not currently have any stable API surface, as it is only an implementation detail of Vello CPU and Vello Hybrid.

Vello CPU

This release contains a number of additions such as support for non-isolated blending, clipping and masking as well as an initial experimental version of image filters. The imaging model exposed by Vello CPU is very similar to that of current Vello.
Crates.io | Docs

This implementation is now broadly usable, with a reasonably complete imaging model and competitive performance.
It does not however have any API stability guarantees, as we intend to redesign the API to be consistent across the Vello renderers.
Performance information can be seen at https://laurenzv.github.io/vello_chart/ (although note that this URL is not "time-locked", so might shows results from a slightly newer or older version than this tag).

Vello Hybrid

This release is the initial release of Vello Hybrid, which uses the CPU for preprocessing and the GPU for rasterization. The imaging model exposed by Vello Hybrid is very similar to that of current Vello.
Crates.io | Docs

This implementation is in its early stages and does not yet provide any API stability guarantees (see the roadmap for more details). It also doesn’t have feature parity with Vello CPU. A few known issues remain, which we plan to address soon.

Full Changelog: sparse-strips-v0.0.4...sparse-strips-v0.0.5

sparse-strips-v0.0.4

17 Oct 08:28
459e0a7

Choose a tag to compare

sparse-strips-v0.0.4 Pre-release
Pre-release

The 4th alpha version of the Vello Sparse Strips renderers (version 0.0.4) has been released.
We expect to follow-up with v0.1.0 in the near future.
You can track this in #vello > Vello CPU v0.1 release.

This release has an MSRV of 1.86.

Here’s the roadmap for Vello Sparse Strips.

We’ve added CHANGELOG.md files to all the crates listed below. There’s no changelog for this release, but we’ll start keeping detailed logs from the next one onward.

Vello Common

This release contains Vello Common, a support crate used by Vello CPU and Vello Hybrid.
Crates.io | Docs

Vello Common itself does not currently have any stable API surface, as it is only an implementation detail of Vello CPU and Vello Hybrid.

Vello CPU

This release contains only minor updates to Vello CPU, which runs entirely on the CPU. The imaging model exposed by Vello CPU is very similar to that of current Vello.
Crates.io | Docs

This implementation is now broadly usable, with a reasonably complete imaging model and competitive performance.
It does not however have any API stability guarantees, as we intend to redesign the API to be consistent across the Vello renderers.
Performance information can be seen at https://laurenzv.github.io/vello_chart/ (although note that this URL is not "time-locked", so might shows results from a slightly newer or older version than this tag).

Vello Hybrid

This release is the initial release of Vello Hybrid, which uses the CPU for preprocessing and the GPU for rasterization. The imaging model exposed by Vello Hybrid is very similar to that of current Vello.
Crates.io | Docs

This implementation is in its early stages and does not yet provide any API stability guarantees (see the roadmap for more details). It also doesn’t have feature parity with Vello CPU. A few known issues remain, which we plan to address soon.

Full Changelog: sparse-strips-v0.0.3...sparse-strips-v0.0.4

v0.6.0

03 Oct 15:56
03f1826

Choose a tag to compare

Crates.io | Docs

This release has an MSRV of 1.85.

Added

  • register_texture, a helper for using wgpu textures in a Vello Renderer. (#1161 by @DJMcNab)
  • push_luminance_mask_layer, content within which is used as a luminance mask. (#1183 by @DJMcNab).
    This is a breaking change to Vello Encoding.
  • push_clip_layer, which replaces the previous push_layer using Mix::Clip, and has fewer footguns. (#1192 by @DJMcNab)
    This is not a breaking change, as Mix::Clip is still supported (although it is deprecated).
  • Support for BGRA format images (as input). (#1173 by @sagudev)

Changed

  • Breaking change: wgpu has been updated to wgpu 26. (#1096 by @waywardmonkeys)
    This has been chosen to match the version used by Bevy 0.17.
    (Note that we do not guarantee that our latest release will always match Bevy's wgpu version.)
  • Breaking change: Put wgpu's default features behind a wgpu_default feature flag. (#1229 by @StT191)
    If you're using Vello with default features enabled, then no change is needed.
  • Breaking change: Updated Peniko to v0.5.0. (#1224 by @DJMcNab)
    This brings several important changes which allow Vello to be used in more use cases:
    • Breaking change: Gradients must have their alpha interpolation space specified. For this, you should use InterpolationAlphaSpace::Premultiplied, unless you are implementing a specification which indicates otherwise.
      Currently, only InterpolationAlphaSpace::Premultiplied is supported.
    • Breaking change: Gradient kinds now have a corresponding struct. For example, GradientKind::Linear {...} is now LinearGradientPosition {...}.into().
      This makes it possible to pass individual gradient kinds between functions.
    • GradientKind::Sweep's defined semantics now match those which Vello previously implemented.
    • Breaking change: Image has been renamed to ImageBrush, consisting of an ImageData and an ImageSampler.
      The equivalent to the old Image::new($data, $format, $width, $height) is ImageBrush::new(ImageData { data: $data, format: $format, width: $width, height: $height, alpha_type: ImageAlphaType::Alpha })
      (or ImageData { ... }.into() if you don't need to set sampler parameters).
    • Breaking change: vello::peniko::Font is now called vello::peniko::FontData.
      This type is also now provided by Linebender Resource Handle.
  • We now treat Vello's shaders as trusted for memory safety purposes. (#1093 by @sagudev)
    If you're using Vello in a security critical environment with user-controlled content, you should audit these shaders yourself, or open an issue to request that these bounds checks are re-enabled.

Linebender Resource Handle

The vello::peniko::Font type used in Vello used to be provided by the Peniko crate, and this was used as vocabulary types for font resources between crates.
However, this means that when Peniko made semver-incompatible releases, crates which used this type could no longer (easily) interoperate.
To resolve this, vello::peniko::FontData (which is the same type but renamed) is now a re-export from a new crate called Linebender Resource Handle.
These types have identical API as in previous releases, but will now be the same type across Peniko versions.

Fixed

  • Examples crashing when window is resized to zero. (#1182 by @xStrom)
  • Correct flattening tolerance calculation from 2D affine transforms. (#1187 by @tomcur)
  • Zero-width strokes were previously treated as fills. (#785 by @DJMcNab)
  • Vello no longer writes to the console, instead outputting to log. (#1017 by @DJMcNab)

This release also coincides with the release of v0.6.0 of Vello Shaders:

Crates.io | Docs

and Vello Encoding:

Crates.io | Docs

New Contributors

Full Changelog: v0.5.0...v0.6.0