Add tiny-skia example (#317)
* tiny skia example * image * remove unnecessary let binding
This commit is contained in:
parent
0a85025345
commit
bc8235fdb1
19
examples/tiny-skia-winit/Cargo.toml
Normal file
19
examples/tiny-skia-winit/Cargo.toml
Normal file
|
@ -0,0 +1,19 @@
|
|||
[package]
|
||||
name = "tiny-skia-winit"
|
||||
version = "0.1.0"
|
||||
authors = ["Jeffrey Rosenbluth <jeffrey.rosenbluth@gmail.com"]
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[features]
|
||||
optimize = ["log/release_max_level_warn"]
|
||||
default = ["optimize"]
|
||||
|
||||
[dependencies]
|
||||
env_logger = "0.9"
|
||||
euclid = "0.22"
|
||||
log = "0.4"
|
||||
pixels = { path = "../.." }
|
||||
winit = "0.27"
|
||||
winit_input_helper = "0.13"
|
||||
tiny-skia = "0.8.2"
|
15
examples/tiny-skia-winit/README.md
Normal file
15
examples/tiny-skia-winit/README.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Hello tiny-skia
|
||||
|
||||
![Hello Tiny-Skia](../../img/tiny-skia-winit.png)
|
||||
|
||||
`tiny-skia` example with `winit`.
|
||||
|
||||
## Running
|
||||
|
||||
```bash
|
||||
cargo run --release --package tiny-skia-winit
|
||||
```
|
||||
|
||||
## About
|
||||
|
||||
This example uses `tiny-skia` to rasterize and animate a few paths.
|
76
examples/tiny-skia-winit/src/main.rs
Normal file
76
examples/tiny-skia-winit/src/main.rs
Normal file
|
@ -0,0 +1,76 @@
|
|||
#![deny(clippy::all)]
|
||||
#![forbid(unsafe_code)]
|
||||
|
||||
use log::error;
|
||||
use pixels::{Error, Pixels, SurfaceTexture};
|
||||
use shape::draw;
|
||||
use std::time::Instant;
|
||||
use tiny_skia::Pixmap;
|
||||
use winit::dpi::LogicalSize;
|
||||
use winit::event::{Event, VirtualKeyCode};
|
||||
use winit::event_loop::{ControlFlow, EventLoop};
|
||||
use winit::window::WindowBuilder;
|
||||
use winit_input_helper::WinitInputHelper;
|
||||
|
||||
mod shape;
|
||||
|
||||
const WIDTH: u32 = 1000;
|
||||
const HEIGHT: u32 = 1000;
|
||||
|
||||
fn main() -> Result<(), Error> {
|
||||
env_logger::init();
|
||||
let event_loop = EventLoop::new();
|
||||
let mut input = WinitInputHelper::new();
|
||||
let window = {
|
||||
let size = LogicalSize::new(WIDTH as f64, HEIGHT as f64);
|
||||
WindowBuilder::new()
|
||||
.with_title("Hello tiny-skia")
|
||||
.with_inner_size(size)
|
||||
.with_min_inner_size(size)
|
||||
.build(&event_loop)
|
||||
.unwrap()
|
||||
};
|
||||
|
||||
let mut pixels = {
|
||||
let window_size = window.inner_size();
|
||||
let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window);
|
||||
Pixels::new(WIDTH, HEIGHT, surface_texture)?
|
||||
};
|
||||
|
||||
let mut drawing = Pixmap::new(1000, 1000).unwrap();
|
||||
let now = Instant::now();
|
||||
|
||||
event_loop.run(move |event, _, control_flow| {
|
||||
// Draw the current frame
|
||||
if let Event::RedrawRequested(_) = event {
|
||||
pixels.get_frame_mut().copy_from_slice(drawing.data());
|
||||
if pixels
|
||||
.render()
|
||||
.map_err(|e| error!("pixels.render() failed: {}", e))
|
||||
.is_err()
|
||||
{
|
||||
*control_flow = ControlFlow::Exit;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle input events
|
||||
if input.update(&event) {
|
||||
// Close events
|
||||
if input.key_pressed(VirtualKeyCode::Escape) || input.quit() {
|
||||
*control_flow = ControlFlow::Exit;
|
||||
return;
|
||||
}
|
||||
|
||||
// Resize the window
|
||||
if let Some(size) = input.window_resized() {
|
||||
pixels.resize_surface(size.width, size.height);
|
||||
}
|
||||
|
||||
// Update internal state and request a redraw
|
||||
// shapes.draw(now.elapsed().as_secs_f32());
|
||||
draw(&mut drawing, now.elapsed().as_secs_f32());
|
||||
window.request_redraw();
|
||||
}
|
||||
});
|
||||
}
|
73
examples/tiny-skia-winit/src/shape.rs
Normal file
73
examples/tiny-skia-winit/src/shape.rs
Normal file
|
@ -0,0 +1,73 @@
|
|||
use tiny_skia::*;
|
||||
|
||||
pub fn draw(pixmap: &mut Pixmap, delta: f32) {
|
||||
let mut paint1 = Paint::default();
|
||||
paint1.set_color_rgba8(50, 107, 160, 255);
|
||||
paint1.anti_alias = true;
|
||||
|
||||
let mut paint2 = Paint::default();
|
||||
paint2.set_color_rgba8(255, 125, 0, 150);
|
||||
paint2.anti_alias = true;
|
||||
|
||||
let mut paint3 = Paint::default();
|
||||
paint3.set_color_rgba8(205, 205, 205, 205);
|
||||
paint3.anti_alias = true;
|
||||
|
||||
let mut paint4 = Paint::default();
|
||||
paint4.set_color_rgba8(128, 0, 128, 255);
|
||||
paint4.anti_alias = true;
|
||||
|
||||
let mut paint5 = Paint::default();
|
||||
paint5.set_color_rgba8(20, 205, 25, 205);
|
||||
paint5.anti_alias = true;
|
||||
|
||||
let path1 = PathBuilder::from_circle(400.0, 400.0, 300.0).unwrap();
|
||||
|
||||
let path2 = {
|
||||
let mut pb = PathBuilder::new();
|
||||
pb.move_to(940.0, 60.0);
|
||||
pb.line_to(840.0, 940.0);
|
||||
pb.cubic_to(620.0, 840.0, 340.0, 800.0, 60.0, 800.0);
|
||||
pb.cubic_to(260.0, 460.0, 560.0, 160.0, 940.0, 60.0);
|
||||
pb.close();
|
||||
pb.finish().unwrap()
|
||||
};
|
||||
|
||||
let mut stroke = Stroke::default();
|
||||
pixmap.fill(Color::from_rgba8(0, 0, 0, 255));
|
||||
pixmap.fill_path(
|
||||
&path1,
|
||||
&paint1,
|
||||
FillRule::Winding,
|
||||
Transform::from_rotate_at(delta * 15.0, 500.0, 500.0),
|
||||
None,
|
||||
);
|
||||
|
||||
stroke.width = 4.0;
|
||||
pixmap.stroke_path(
|
||||
&path1,
|
||||
&paint5,
|
||||
&stroke,
|
||||
Transform::from_rotate_at(delta * 15.0, 500.0, 500.0),
|
||||
None,
|
||||
);
|
||||
|
||||
stroke.width = 48.0;
|
||||
pixmap.stroke_path(
|
||||
&path1,
|
||||
&paint4,
|
||||
&stroke,
|
||||
Transform::from_rotate_at(-delta * 25.0, 500.0, 500.0).post_scale(0.75, 0.75),
|
||||
None,
|
||||
);
|
||||
|
||||
pixmap.fill_path(
|
||||
&path2,
|
||||
&paint2,
|
||||
FillRule::Winding,
|
||||
Transform::identity(),
|
||||
None,
|
||||
);
|
||||
stroke.width = 8.0;
|
||||
pixmap.stroke_path(&path2, &paint3, &stroke, Transform::identity(), None);
|
||||
}
|
BIN
img/tiny-skia-winit.png
Normal file
BIN
img/tiny-skia-winit.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 102 KiB |
Loading…
Reference in a new issue