capabilities/
capabilities.rs

1extern crate raqote;
2
3use raqote::*;
4use std::fs::*;
5use sw_composite::{Gradient, GradientStop, Image};
6
7use font_kit::family_name::FamilyName;
8use font_kit::properties::Properties;
9use font_kit::source::SystemSource;
10
11fn main() {
12    let mut dt = DrawTarget::new(400, 400);
13
14    let mut pb = PathBuilder::new();
15    pb.move_to(340., 190.);
16    pb.arc(160., 190., 180., 0., 2. * 3.14159);
17    pb.close();
18    let path = pb.finish();
19    dt.push_clip(&path);
20
21    let mut pb = PathBuilder::new();
22    pb.move_to(0., 0.);
23    pb.line_to(200., 0.);
24    pb.line_to(200., 300.);
25    pb.line_to(0., 300.);
26    pb.close();
27    let path = pb.finish();
28    dt.fill(
29        &path,
30        &Source::Solid(SolidSource {
31            r: 0x80,
32            g: 0x80,
33            b: 0,
34            a: 0x80,
35        }),
36        &DrawOptions::new(),
37    );
38
39    let mut pb = PathBuilder::new();
40    pb.move_to(50., 50.);
41    pb.line_to(100., 70.);
42    pb.line_to(110., 150.);
43    pb.line_to(40., 180.);
44    pb.close();
45
46    /*
47    dt.move_to(100., 10.);
48    dt.quad_to(150., 40., 200., 10.);
49    dt.quad_to(120., 100., 80., 200.);
50    dt.quad_to(150., 180., 200., 200.);
51    dt.close();
52    */
53
54    pb.move_to(100., 10.);
55    pb.cubic_to(150., 40., 175., 0., 200., 10.);
56    pb.quad_to(120., 100., 80., 200.);
57    pb.quad_to(150., 180., 200., 200.);
58    pb.close();
59
60    let path = pb.finish();
61
62    let decoder = png::Decoder::new(File::open("photo.png").unwrap());
63    let mut reader = decoder.read_info().unwrap();
64    let mut buf = vec![0; reader.output_buffer_size()];
65    let info = reader.next_frame(&mut buf).unwrap();
66
67    println!("{:?}", info.color_type);
68
69    let mut image: Vec<u32> = Vec::new();
70    for i in buf.chunks(3) {
71        image.push(0xff << 24 | ((i[0] as u32) << 16) | ((i[1] as u32) << 8) | (i[2] as u32))
72    }
73    let _bitmap = Image {
74        width: info.width as i32,
75        height: info.height as i32,
76        data: &image[..],
77    };
78
79    //dt.fill(Source::Solid(SolidSource{r: 0xff, g: 0xff, b: 0, a: 0xff}));
80    //dt.fill(Source::Bitmap(bitmap, Transform::create_scale(2., 2.)));
81
82    let gradient = Source::RadialGradient(
83        Gradient {
84            stops: vec![
85                GradientStop {
86                    position: 0.2,
87                    color: Color::new(0xff, 0x00, 0xff, 0x00),
88                },
89                GradientStop {
90                    position: 0.8,
91                    color: Color::new(0xff, 0xff, 0xff, 0xff),
92                },
93                GradientStop {
94                    position: 1.,
95                    color: Color::new(0xff, 0xff, 0x00, 0xff),
96                },
97            ],
98        },
99        Spread::Pad,
100        Transform::translation(-150., -150.),
101    );
102    dt.fill(&path, &gradient, &DrawOptions::new());
103
104    let mut pb = PathBuilder::new();
105    pb.move_to(200., 200.);
106    pb.line_to(300., 300.);
107    pb.line_to(200., 300.);
108
109    let path = pb.finish();
110    dt.stroke(
111        &path,
112        &gradient,
113        &StrokeStyle {
114            cap: LineCap::Butt,
115            join: LineJoin::Bevel,
116            width: 10.,
117            miter_limit: 2.,
118            dash_array: vec![10., 5.],
119            dash_offset: 3.,
120        },
121        &DrawOptions::new(),
122    );
123
124    let font = SystemSource::new()
125        .select_best_match(&[FamilyName::SansSerif], &Properties::new())
126        .unwrap()
127        .load()
128        .unwrap();
129
130    dt.draw_text(
131        &font,
132        24.,
133        "Hello",
134        Point::new(0., 100.),
135        &Source::Solid(SolidSource {
136            r: 0,
137            g: 0,
138            b: 0xff,
139            a: 0xff,
140        }),
141        &DrawOptions::new(),
142    );
143
144    dt.write_png("out.png").unwrap();
145}