tinyvg-rs

This is a Rust implementation of the TinyVG image format. It provides an executable that renders PNG images from TinyVG input files, and a library that can render PNG images or any format supported by piet::RenderContext.

Dependencies

All dependencies but one are managed by cargo. This program/library does depend on cairo for rendering PNGs. You should be able to install cairo using your OS package manager.

Executable

Installation

$ cargo install tinyvg

Usage

``` tinyvg 0.1.0 TinyVG to PNG renderer

USAGE: tinyvg [OPTIONS]

FLAGS: -h, --help Prints help information -V, --version Prints version information

OPTIONS: -o Optional output path. If not specified, uses the input path with a .png suffix

ARGS: Input path to TinyVG binary file ```

Library Usage

```rust use tinyvg::Decoder; use std::fs::File;

fn main() -> eyre::Result<()> { // Build a decoder from a std::io::Read. Here a file is used, but any type // that implements Read can be used. let decoder = Decoder::new(File::open("data/shield.tvg")?);

let image = decoder.decode()?;

let mut out = File::create("out.png")?;

// Render the image to a PNG file. Here a file is used, but any type
// that implements `std::io::Write` can be used.
image.render_png(&mut out)?;

Ok(())

} ```

Development

Testing

There are some doctests which validate that certain files can be decoded and rendered without errors, but there currently isn't much in the way of automated testing. I wasn't sure how to effectively write equality tests without writing a massive amount of code. There is an example program which will crawl the data directory and render all .tvg files into .png files with the same names. This can be used to validate rendering behavior for example images.

``` $ cargo run --example render-all path render time data/app_icon.tvg 78.94075ms data/chart.tvg 14.194083ms data/comic.tvg 23.534791ms data/everything.tvg 21.251875ms data/flowchart.tvg 5.075ms data/shield.tvg 597.916µs data/tiger.tvg 35.942166ms

$ open data/tiger.png ```

There is also a criterion benchmarking suite which tests decoding and rendering.

$ cargo bench TinyVG/decode/tiger.tvg time: [135.98 us 136.65 us 137.34 us] TinyVG/render/tiger.tvg time: [27.541 ms 27.629 ms 27.744 ms]