Lyon

GPU-based 2D graphics rendering in rust.

Project logo

crates.io Travis Build Status documentation

Motivation

For now the goal is to provide efficient SVG-compliant path tessellation tools to help with rendering vector graphics on the GPU. For now think of this library as a way to turn complex paths into triangles for use in your own rendering engine.

The intent is for this library to be useful in projects like Servo and games.

Example

```rust // Build a Path. let mut builder = SvgPathBuilder::new(Path::builder()); builder.moveto(point(0.0, 0.0)); builder.lineto(point(1.0, 0.0)); builder.quadraticbezierto(point(2.0, 0.0), point(2.0, 1.0)); builder.cubicbezierto(point(1.0, 1.0), point(0.0, 1.0), point(0.0, 0.0)); builder.close(); let path = builder.build();

// Will contain the result of the tessellation.
let mut geometry_cpu: VertexBuffers<Vec2> = VertexBuffers::new();

let mut tessellator = FillTessellator::new();

{
    // The simple builder uses the tessellator's vertex type.
    // You can implement the GeometryBuilder trait to create custom vertices.
    let mut vertex_builder = simple_builder(&mut geometry_cpu);

    // Compute the tessellation.
    tessellator.tessellate_path(
        path.path_iter().flattened(0.1),
        &FillOptions::default(),
        &mut vertex_builder
    ).unwrap();
}

// The tessellated geometry is ready to be uploaded to the GPU.
println!(" -- {} vertices {} indices",
    geometry_cpu.vertices.len(),
    geometry_cpu.indices.len()
);

```

Structure

The project is split into small crates:

There is also a toy command-line tool to tessellate SVG path from your favorite terminal.

Have a look at the gfx-rs example to see how integrating the tessellators in a renderer can look like.

TODO

There's a rough list of things to do in the wiki. If you are interested in contributing, please let me know on twitter (@nicalsilva) or by e-mail.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.