B1: femtovg Canvas::set_size queues SetRenderTarget(Screen) without updating current_render_target — the scene set_render_target() was silently undone and the Copy blit overwrote the frame with the empty persistent texture (black window on the first env-gated frame). Root-fixed in vendored femtovg (keep the field in sync with the queued command — upstream-able) + re-assert the scene target after the notifier block's set_size. B2: BoxShadow/Transform/Opacity/Layer/Clip bypass the proxy's filter_item and re-render every frame (core item_rendering.rs:209-217) — with a multi-rect dirty region they re-blended over uncleared pixels in the gaps between rects (progressive smear). Collapse the dirty region to its single bounding rect so filter, scissor and clears all agree on one rect. M1: visualize outline now strokes on the swapchain after the blit (drawn into the persistent texture it accumulated). Also: case-insensitive env parsing; stale-comment corrections. km
femtovg
GPU Antialiased 2D vector drawing library written in Rust.
Ported from https://github.com/memononen/nanovg
Most of the implementation is the same as the original C code with some bug fixes, some features added and several parts have been made more Rust-y. Rendering is done via one OpenGl (ES) 3.0+ backend.
Screenshots
Demo
Run with cargo run --example demo
Breakout
Run with cargo run --example breakout
SVG
Run with cargo run --example svg
Text
Run with cargo run --example text
Features
- Anti-aliasing
- Bézier paths filling and stroking
- Solid color and image pattern fills and strokes
- Gradients - box, linear and radial
- Stroke width and miterlimit
- Stroke caps: butt, round and square
- Stroke joins: miter, round and bevel
- Fill rules - EvenOdd/NonZero
- Rectangle scissoring
- Composition modes (SourceOver, SourceIn, SourceOut, Atop, etc..)
- Global alpha
- Text filling and stroking
- Text shaping
- Text alignment: (left center right), (top, middle, alphabetic, bottom)
- Nearest font matching
- Path hit testing
- OpenGl ES2 backend
- WGPU backend
- Color fonts
Not supported
- Stroke dashing
- Path scissoring
- Custom shaders
- 3D transforms
Ecosystem
FemtoVG is used by these projects:
- pn-editor https://gitlab.com/porky11/pn-editor: view, edit, and simulate petri nets
- Slint https://slint.dev: A declarative GUI toolkit to build native user interfaces for embedded, desktop, and mobile application
- inlottie https://github.com/mhfan/inlottie: lib/tool in Rust for Lottie (Bodymovin) Animation
- Mapvas https://github.com/UdHo/mapvas: A map canvas showing OSM tiles with drawing functionality
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT) at your option.
Fonts used in examples:
- Roboto licensed under Apache license
- Entypo licensed under CC BY-SA 4.0.
- Amiri licensed under SIL Open Font License, Version 1.1