Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented PngRenderer #4

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ rgb = "0.8.14"
svg = "0.5.12"
rand = {version="0.7.0", features=["small_rng"]}
cgmath = "0.17.0"
usvg = "0.35.0"
resvg = "0.35.0"
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

A small Rust library for 2D drawing.
Simple display list and vector shapes.
Currently supports SVG output, designed to also support PNG and other formats.
Currently supports SVG and PNG output, designed to also support other formats.

## Example
```rust
Expand Down Expand Up @@ -43,7 +43,7 @@ render::save(
- [x] Draw anything other than a rectangle
- [x] Positions
- [x] Styles
- [ ] Bitmap image output
- [x] Bitmap image output

## Useful Commands

Expand Down
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ pub mod style;

pub use crate::canvas::Canvas;
pub use crate::drawing::{DisplayList, Drawing};
pub use crate::render::bitmap::PngRenderer;
pub use crate::render::svg::SvgRenderer;
pub use crate::shape::{LineBuilder, Shape};
pub use crate::style::Color;
Expand Down
30 changes: 24 additions & 6 deletions src/render/bitmap.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,31 @@
//! Render Canvas to bitmap formats (PNG, JPG, etc...)
use crate::render::Renderer;
use crate::render::{svg::SvgRenderer, Renderer};
use crate::Canvas;
use usvg::TreeParsing;

/// Renders `Canvas` to a PNG format
/// todo: Implement!
pub struct PNGRenderer {}
pub struct PngRenderer {
svg_renderer: SvgRenderer,
}

impl PngRenderer {
pub fn new() -> Self {
PngRenderer {
svg_renderer: SvgRenderer::new(),
}
}
}

impl Renderer for PngRenderer {
fn render(&self, canvas: &Canvas) -> Vec<u8> {
let opt = usvg::Options::default();

let svg_data = self.svg_renderer.render(canvas);
let rtree = usvg::Tree::from_data(&svg_data, &opt).unwrap();
let mut pixmap = resvg::tiny_skia::Pixmap::new(canvas.width, canvas.height).unwrap();

resvg::Tree::from_usvg(&rtree).render(usvg::Transform::default(), &mut pixmap.as_mut());

impl Renderer for PNGRenderer {
fn render(&self, _canvas: &Canvas) -> Vec<u8> {
unimplemented!()
pixmap.encode_png().unwrap()
}
}
23 changes: 21 additions & 2 deletions tests/functional.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use draw::*;

#[test]
fn basic_end_to_end() {
fn test_canvas() -> Canvas {
// create a canvas to draw on
let mut canvas = Canvas::new(100, 100);

Expand All @@ -20,6 +19,13 @@ fn basic_end_to_end() {
// add it to the canvas
canvas.display_list.add(rect);

canvas
}

#[test]
fn basic_end_to_end_svg() {
let canvas = test_canvas();

// save the canvas as an svg
render::save(
&canvas,
Expand All @@ -28,3 +34,16 @@ fn basic_end_to_end() {
)
.expect("Failed to save");
}

#[test]
fn basic_end_to_end_png() {
let canvas = test_canvas();

// save the canvas as a png
render::save(
&canvas,
"tests/png/basic_end_to_end.png",
PngRenderer::new(),
)
.expect("Failed to save");
}
34 changes: 31 additions & 3 deletions tests/integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ use draw::*;
use rand::rngs::SmallRng;
use rand::{Rng, SeedableRng};

#[test]
fn lines() {
fn lines_canvas() -> Canvas {
let mut canvas = Canvas::new(100, 100);

// create a line that starts in the top middle of the screen, then draw down the middle
Expand All @@ -19,12 +18,26 @@ fn lines() {

canvas.display_list.add(drawing);

canvas
}

#[test]
fn lines_svg() {
let canvas = lines_canvas();

// save the canvas as an svg
render::save(&canvas, "tests/svg/lines.svg", SvgRenderer::new()).expect("Failed to save");
}

#[test]
fn random_circles() {
fn lines_png() {
let canvas = lines_canvas();

// save the canvas as an png
render::save(&canvas, "tests/png/lines.png", PngRenderer::new()).expect("Failed to save");
}

fn random_circles_canvas() -> Canvas {
let mut canvas = Canvas::new(1000, 1000);
let mut rng = SmallRng::from_seed([0; 16]);
let mut points = vec![];
Expand All @@ -44,6 +57,21 @@ fn random_circles() {
canvas.display_list.add(circle);
}

canvas
}

#[test]
fn random_circles_svg() {
let canvas = random_circles_canvas();

draw::render::save(&canvas, "tests/svg/random_circles.svg", SvgRenderer::new())
.expect("Failed to save");
}

#[test]
fn random_circles_png() {
let canvas = random_circles_canvas();

draw::render::save(&canvas, "tests/png/random_circles.png", PngRenderer::new())
.expect("Failed to save");
}
Binary file added tests/png/basic_end_to_end.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tests/png/lines.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tests/png/random_circles.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20,000 changes: 10,000 additions & 10,000 deletions tests/svg/random_circles.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.