1pub mod color;
3pub mod font;
4pub mod font_atlas;
5pub mod font_face;
6pub mod font_family;
7pub mod fonts;
8pub mod geom;
9pub mod glyph_outline;
10pub mod glyph_raster_image;
11pub mod image;
12pub mod intern;
13pub mod layouter;
14pub mod loader;
15pub mod num;
16pub mod rasterizer;
17pub mod sdfer;
18pub mod selection;
19pub mod shaper;
20pub mod slice;
21pub mod substr;
22
23#[cfg(test)]
24mod tests {
25 #[test]
26 fn test() {
27 use {
28 super::{
29 color::Color,
30 layouter::{LayoutOptions, Layouter, OwnedLayoutParams, Settings, Span, Style},
31 },
32 std::{fs::File, io::BufWriter},
33 };
34
35 let mut layouter = Layouter::new(Settings::default());
36 let text = "\n\ntest";
37 let laidout_text = layouter.get_or_layout(OwnedLayoutParams {
38 text: text.into(),
39 spans: [Span {
40 style: Style {
41 font_family_id: "Sans".into(),
42 font_size_in_pts: 16.0,
43 color: Some(Color::RED),
44 },
45 len: text.len(),
46 }]
47 .into(),
48 options: LayoutOptions {
49 max_width_in_lpxs: Some(1018.0),
50 ..LayoutOptions::default()
51 },
52 });
53 println!("{:?}", laidout_text.size_in_lpxs);
54
55 let mut layouter = Layouter::new(Settings::default());
56 let text = "The quick brown fox jumps over the lazy dog繁😊😔";
57 let text = layouter.get_or_layout(OwnedLayoutParams {
58 text: text.into(),
59 spans: [
60 Span {
61 style: Style {
62 font_family_id: "Sans".into(),
63 font_size_in_pts: 16.0,
64 color: Some(Color::RED),
65 },
66 len: 10,
67 },
68 Span {
69 style: Style {
70 font_family_id: "Sans".into(),
71 font_size_in_pts: 16.0,
72 color: Some(Color::GREEN),
73 },
74 len: 10,
75 },
76 Span {
77 style: Style {
78 font_family_id: "Sans".into(),
79 font_size_in_pts: 16.0,
80 color: Some(Color::BLUE),
81 },
82 len: text.len() - 20,
83 },
84 ]
85 .into(),
86 options: LayoutOptions {
87 max_width_in_lpxs: Some(256.0),
88 ..LayoutOptions::default()
89 },
90 });
91 for row in &text.rows {
92 for glyph in &row.glyphs {
93 glyph.font.rasterize_glyph(glyph.id, 64.0);
94 }
95 }
96
97 let file = File::create("/Users/ejpbruel/Desktop/grayscale.png").unwrap();
98 let writer = BufWriter::new(file);
99 let rasterizer = layouter.rasterizer().borrow();
100 let size = rasterizer.grayscale_atlas().size();
101 let mut encoder = png::Encoder::new(writer, size.width as u32, size.height as u32);
102 encoder.set_color(png::ColorType::Grayscale);
103 encoder.set_depth(png::BitDepth::Eight);
104 let mut writer = encoder.write_header().unwrap();
105 let pixels = rasterizer.grayscale_atlas().image().as_pixels();
106 let data =
107 unsafe { std::slice::from_raw_parts(pixels.as_ptr() as *const u8, pixels.len()) };
108 writer.write_image_data(&data).unwrap();
109
110 let file = File::create("/Users/ejpbruel/Desktop/color.png").unwrap();
111 let writer = BufWriter::new(file);
112 let size = rasterizer.color_atlas().size();
113 let mut encoder = png::Encoder::new(writer, size.width as u32, size.height as u32);
114 encoder.set_color(png::ColorType::Rgba);
115 encoder.set_depth(png::BitDepth::Eight);
116 let mut writer = encoder.write_header().unwrap();
117 let pixels = rasterizer.color_atlas().image().as_pixels();
118 let data =
119 unsafe { std::slice::from_raw_parts(pixels.as_ptr() as *const u8, pixels.len() * 4) };
120 writer.write_image_data(&data).unwrap();
121 }
122}