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 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 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}