image_on_image/
image_on_image.rs

1use tiny_skia::*;
2
3fn main() {
4    let triangle = create_triangle();
5
6    let mut pixmap = Pixmap::new(400, 400).unwrap();
7
8    let now = std::time::Instant::now();
9
10    let mut paint = PixmapPaint::default();
11    paint.quality = FilterQuality::Bicubic;
12
13    pixmap.draw_pixmap(
14        20,
15        20,
16        triangle.as_ref(),
17        &paint,
18        Transform::from_row(1.2, 0.5, 0.5, 1.2, 0.0, 0.0),
19        None,
20    );
21
22    println!(
23        "Rendered in {:.2}ms",
24        now.elapsed().as_micros() as f64 / 1000.0
25    );
26
27    pixmap.save_png("image.png").unwrap();
28}
29
30fn create_triangle() -> Pixmap {
31    let mut paint = Paint::default();
32    paint.set_color_rgba8(50, 127, 150, 200);
33    paint.anti_alias = true;
34
35    let mut pb = PathBuilder::new();
36    pb.move_to(0.0, 200.0);
37    pb.line_to(200.0, 200.0);
38    pb.line_to(100.0, 0.0);
39    pb.close();
40    let path = pb.finish().unwrap();
41
42    let mut pixmap = Pixmap::new(200, 200).unwrap();
43
44    pixmap.fill_path(
45        &path,
46        &paint,
47        FillRule::Winding,
48        Transform::identity(),
49        None,
50    );
51
52    let path = PathBuilder::from_rect(Rect::from_ltrb(0.0, 0.0, 200.0, 200.0).unwrap());
53    let stroke = Stroke::default();
54    paint.set_color_rgba8(200, 0, 0, 220);
55
56    pixmap.stroke_path(&path, &paint, &stroke, Transform::identity(), None); // TODO: stroke_rect
57
58    pixmap
59}