large_image/
large_image.rs

1use tiny_skia::*;
2
3// This example will crate a 20_000x20_000px image, which can take a while in a debug mode.
4// This example is used mainly to tests that our tiling algorithm actually works and doesn't panic.
5
6fn main() {
7    let path1 = {
8        let mut pb = PathBuilder::new();
9        pb.move_to(1200.0, 1200.0);
10        pb.line_to(3200.0, 18800.0);
11        pb.cubic_to(7600.0, 16800.0, 13200.0, 16000.0, 18800.0, 16000.0);
12        pb.cubic_to(14800.0, 9200.0, 8800.0, 3200.0, 1200.0, 1200.0);
13        pb.close();
14        pb.finish().unwrap()
15    };
16
17    let path2 = {
18        let mut pb = PathBuilder::new();
19        pb.move_to(18800.0, 1200.0);
20        pb.line_to(16800.0, 18800.0);
21        pb.cubic_to(12400.0, 16800.0, 6800.0, 16000.0, 1200.0, 16000.0);
22        pb.cubic_to(5200.0, 9200.0, 11200.0, 3200.0, 18800.0, 1200.0);
23        pb.close();
24        pb.finish().unwrap()
25    };
26
27    let mut pixmap = Pixmap::new(20000, 20000).unwrap();
28
29    let clip_path = {
30        let mut pb = PathBuilder::new();
31        pb.push_circle(10000.0, 10000.0, 7000.0);
32        pb.finish().unwrap()
33    };
34
35    let mut mask = Mask::new(20000, 20000).unwrap();
36    mask.fill_path(&clip_path, FillRule::Winding, true, Transform::default());
37
38    let mut paint = Paint::default();
39    paint.set_color_rgba8(90, 175, 100, 150);
40    paint.anti_alias = true;
41    let large_rect = Rect::from_xywh(500.0, 500.0, 19000.0, 19000.0).unwrap();
42    pixmap.fill_rect(large_rect, &paint, Transform::identity(), None);
43
44    paint.set_color_rgba8(50, 127, 150, 200);
45    paint.anti_alias = true;
46    pixmap.fill_path(
47        &path1,
48        &paint,
49        FillRule::Winding,
50        Transform::default(),
51        Some(&mask),
52    );
53
54    paint.set_color_rgba8(220, 140, 75, 180);
55    paint.anti_alias = false;
56    pixmap.fill_path(
57        &path2,
58        &paint,
59        FillRule::Winding,
60        Transform::default(),
61        None,
62    );
63
64    paint.set_color_rgba8(255, 10, 15, 180);
65    paint.anti_alias = true;
66    let mut stroke = Stroke::default();
67    stroke.width = 0.8; // hairline
68    pixmap.stroke_path(&path2, &paint, &stroke, Transform::default(), None);
69
70    pixmap.save_png("image.png").unwrap();
71}