1 unstable release
0.1.0 | Sep 25, 2023 |
---|
#488 in Graphics APIs
315KB
4K
SLoC
This is a port of the WPF hardware rasterizer code to Rust. That rasterizer is predecessor to the Direct2D rasterizer. Direct2D still uses a similar technique when run on hardware that does not support Target Independent Rasterization.
Design
The general algorithm used for rasterization is a vertical sweep of the shape that maintains an active edge list. The sweep is done at a sub-scanline resolution and results in either:
- Sub-scanlines being combined in the coverage buffer and output as "complex scans". These are emitted as lines constructed out of triangle strips.
- Simple trapezoids being recognized in the active edge list and output using a faster simple trapezoid path.
Bezier flattening is done using an approach that uses forward differencing of the error metric to compute a flattened version that would match a traditional adaptive recursive flattening.
lib.rs
:
Converts a 2D path into a set of vertices of a triangle strip mesh that represents the antialiased fill of that path.
use wpf_gpu_raster::PathBuilder;
let mut p = PathBuilder::new();
p.move_to(10., 10.);
p.line_to(40., 10.);
p.line_to(40., 40.);
let result = p.rasterize_to_tri_list(0, 0, 100, 100);