Skip to content

Sparse Strips v0.3.0

Choose a tag to compare

@LaurenzV LaurenzV released this 02 Oct 19:48
· 18 commits to main since this release
f3000c8

This release has an MSRV of 1.89.

As part of this release, Vello Hybrid has been renamed to Vello GPU.

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 Vello Research.

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 this URL is not time-locked, so it might show results from a slightly newer or older version than this tag).

Added

  • RenderContext::push_clip_rect for non-isolated rectangular clipping. (#1916 by @LaurenzV)
  • Support for ImageSampler::alpha. (#1880 by @LaurenzV)

Changed

  • Breaking change: Replaced CompositeMode with TargetInit, adding configurable target clears. (#1866 by @LaurenzV)
  • Breaking change: Renamed RenderContext::pop_clip_path to pop_clip. (#1942 by @LaurenzV)
  • Breaking change: GlyphRunBuilder::fill_glyphs and stroke_glyphs now return Result<(), glifo::GlyphRenderError>. (#1944 by @LaurenzV)
  • Breaking change: Updated fearless_simd to v0.7.0. (#1853 by @LaurenzV)
  • Breaking change: Reorganized shared type re-exports and removed the crate-root Paint re-export. (#1881 by @LaurenzV)
  • Root-level blend operations are now isolated from the target background. (#1865 by @LaurenzV)
  • Bitmap glyphs now consistently use bilinear sampling (ImageQuality::Medium) instead of switching to bicubic sampling when downscaled. (#1970 by @LaurenzV)

Fixed

  • Image-sampling errors near texel boundaries with Repeat, Reflect, and bilinear/bicubic filtering. (#1946, #1950 by @LaurenzV)
  • Scene contents being cut off when compositing over a background in the u8 pipeline. (#1933 by @LaurenzV)
  • Layer opacity is now clamped to the range 0 to 1. (#1856 by @LaurenzV)
  • Rendering on big-endian targets. (#1845 by @LaurenzV)
  • Gradient cache collisions between premultiplied and unpremultiplied alpha interpolation. (#1932 by @LaurenzV)
  • Draws with non-invertible paint transforms are now skipped. (#1949 by @grebmeg)
  • Resetting a render context now also resets the aliasing threshold. (#1945 by @LaurenzV)
  • Incorrect placement of non-Apple sbix glyphs caused by the Apple Color Emoji workaround. (#1936 by @LaurenzV)
  • Incorrect sbix glyph placement caused by sign errors in bearing offsets. (#1939 by @LaurenzV)

Optimized

Vello GPU

This release is a minor release of Vello GPU (formerly Vello Hybrid), which uses the CPU for preprocessing and the GPU for rasterization. The imaging model exposed by Vello GPU is very similar to that of Vello Research.

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

  • An unminified feature in vello_gpu_shaders for readable shader output. (#1851 by @grebmeg)
  • Non-blocking WebGL initialization through WebGlRenderer::begin and begin_with. (#1823 by @grebmeg)
  • Scene::push_clip_rect for non-isolated rectangular clipping. (#1916 by @LaurenzV)
  • Support for ImageSampler::alpha. (#1880 by @LaurenzV)

Changed

  • Breaking change: Renamed the vello_hybrid crate to vello_gpu. HybridGlyphRunBackend is now GpuGlyphRunBackend. (#1883 by @grebmeg, #1918 by @LaurenzV)
  • Breaking change: Updated wgpu to v30 and fearless_simd to v0.7.0. (#1909, #1853 by @LaurenzV)
  • Breaking change: External textures now use Scene::set_paint, replacing draw_texture_rects and adding support for arbitrary shapes, extend modes, and transparency hints. (#1812, #1813, #1824 by @LaurenzV)
  • Breaking change: Depth buffering is now optional, with caller-owned depth textures in wgpu and a use_depth_buffer argument in WebGL. (#1808, #1810 by @grebmeg)
  • Breaking change: Rendering now accepts configurable target clears through TargetInit in wgpu and a clear color in WebGL. (#1869 by @LaurenzV)
  • Breaking change: WebGL operations now return structured WebGlError results. (#1892 by @LaurenzV, #1921 by @grebmeg)
  • Breaking change: RenderSize, RenderTargetConfig, atlas configuration, and related dimensions now use u16. (#1826, #1891 by @LaurenzV)
  • Breaking change: Image atlases now use individual 2D textures, and atlas_texture takes an AtlasId. (#1859 by @LaurenzV)
  • Breaking change: WebGL probes now support configurable features, depth-buffer testing, and per-cell statistics. (#1900, #1901, #1908 by @LaurenzV)
  • Breaking change: Renamed Scene::pop_clip_path to pop_clip. (#1942 by @LaurenzV)
  • Breaking change: GlyphRunBuilder::fill_glyphs and stroke_glyphs now return Result<(), glifo::GlyphRenderError>. (#1944 by @LaurenzV)
  • Expanded shared type re-exports. (#1881 by @LaurenzV)
  • WebGL context creation now requests failIfMajorPerformanceCaveat. (#1806 by @LaurenzV)
  • Bitmap glyphs now consistently use bilinear sampling (ImageQuality::Medium) instead of switching to bicubic sampling when downscaled. (#1970 by @LaurenzV)

Fixed

  • Fully transparent draws are no longer skipped, fixing missing output from filters such as flood effects. (#1966 by @AdrianEddy, @LaurenzV)
  • The std feature no longer implicitly enables wgpu. (#1822 by @taj-p)
  • Safari 15 probe crashes and incorrect filter rendering. (#1814, #1821 by @LaurenzV)
  • WebGL hangs on affected Intel GPUs. (#1830 by @LaurenzV)
  • Incorrect layer rendering and probe failures on affected Apple Silicon/Chrome versions. (#1864 by @LaurenzV)
  • Removed an artificial image-sampling offset. (#1878 by @LaurenzV)
  • Gradient cache collisions between premultiplied and unpremultiplied alpha interpolation. (#1932 by @LaurenzV)
  • Draws with non-invertible paint transforms are now skipped. (#1949 by @grebmeg)
  • Resetting a scene now also resets the aliasing threshold. (#1945 by @LaurenzV)
  • Incorrect placement of non-Apple sbix glyphs caused by the Apple Color Emoji workaround. (#1936 by @LaurenzV)
  • Incorrect sbix glyph placement caused by sign errors in bearing offsets. (#1939 by @LaurenzV)

Optimized

Vello Common

This release also contains Vello Common, a support crate used by Vello CPU and Vello GPU.

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 GPU.

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

Full Changelog: sparse-strips-v0.2.0...sparse-strips-v0.3.0

Contributors