diff options
author | Minijackson <minijackson@riseup.net> | 2022-12-22 12:19:59 +0100 |
---|---|---|
committer | Minijackson <minijackson@riseup.net> | 2022-12-22 12:19:59 +0100 |
commit | 92a02c34628343153b33602eae00cef46e28d191 (patch) | |
tree | 8622ec528d24e456be22d984d93aa9bcafc97399 /cairo-renderer/src/lib.rs | |
download | diaphragm-92a02c34628343153b33602eae00cef46e28d191.tar.gz diaphragm-92a02c34628343153b33602eae00cef46e28d191.zip |
WIP
Diffstat (limited to 'cairo-renderer/src/lib.rs')
-rw-r--r-- | cairo-renderer/src/lib.rs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/cairo-renderer/src/lib.rs b/cairo-renderer/src/lib.rs new file mode 100644 index 0000000..26ca089 --- /dev/null +++ b/cairo-renderer/src/lib.rs | |||
@@ -0,0 +1,111 @@ | |||
1 | use diaphragm_core::{ | ||
2 | styles::{Pattern, DefinedDashStyle}, | ||
3 | text::{DefinedFontDescription, FontDescription}, | ||
4 | Renderer, | ||
5 | }; | ||
6 | |||
7 | pub struct CairoRenderer { | ||
8 | ctx: cairo::Context, | ||
9 | } | ||
10 | |||
11 | impl CairoRenderer { | ||
12 | pub fn new() -> Self { | ||
13 | // TODO: properly | ||
14 | let surface = cairo::SvgSurface::for_stream(1920., 1080., std::io::stdout()).unwrap(); | ||
15 | let ctx = cairo::Context::new(&surface); | ||
16 | |||
17 | Self { ctx } | ||
18 | } | ||
19 | } | ||
20 | |||
21 | impl Renderer for CairoRenderer { | ||
22 | fn move_to(&mut self, x: f64, y: f64) { | ||
23 | self.ctx.move_to(x, y) | ||
24 | } | ||
25 | |||
26 | fn stroke(&mut self) { | ||
27 | self.ctx.stroke(); | ||
28 | } | ||
29 | |||
30 | fn fill(&mut self) { | ||
31 | self.ctx.fill(); | ||
32 | } | ||
33 | |||
34 | fn fill_preserve(&mut self) { | ||
35 | self.ctx.fill_preserve(); | ||
36 | } | ||
37 | |||
38 | fn set_pattern(&mut self, pattern: &Pattern) { | ||
39 | match pattern { | ||
40 | Pattern::Solid(color) => { | ||
41 | let (red, green, blue, alpha) = color.rgba(); | ||
42 | self.ctx.set_source_rgba(red, green, blue, alpha) | ||
43 | } | ||
44 | Pattern::None => {} | ||
45 | _ => panic!("Unhandled pattern"), | ||
46 | } | ||
47 | } | ||
48 | |||
49 | fn set_dash(&mut self, dash: &DefinedDashStyle) { | ||
50 | self.ctx.set_dash(&dash.dashes(), dash.offset()); | ||
51 | } | ||
52 | |||
53 | fn clear_dash(&mut self) { | ||
54 | self.ctx.set_dash(&[], 0.); | ||
55 | } | ||
56 | |||
57 | fn set_line_width(&mut self, width: f64) { | ||
58 | self.ctx.set_line_width(width); | ||
59 | } | ||
60 | |||
61 | fn line_to(&mut self, x: f64, y: f64) { | ||
62 | self.ctx.line_to(x, y) | ||
63 | } | ||
64 | |||
65 | fn rectangle(&mut self, x: f64, y: f64, width: f64, height: f64) { | ||
66 | self.ctx.rectangle(x, y, width, height); | ||
67 | } | ||
68 | |||
69 | fn text_extents(&self, text: &str, font: &FontDescription) -> (f64, f64) { | ||
70 | let layout = pangocairo::create_layout(&self.ctx).expect("Couldn't create layout"); | ||
71 | let font_desc = pango::FontDescription::from_string(&font.family); | ||
72 | layout.set_font_description(Some(&font_desc)); | ||
73 | layout.set_markup(text); | ||
74 | |||
75 | //let (extents, _) = layout.get_pixel_extents(); | ||
76 | //(extents.width as f64, extents.height as f64) | ||
77 | |||
78 | // TODO: get height from the baseline | ||
79 | let mut layout_iter = layout.get_iter().unwrap(); | ||
80 | let _height = loop { | ||
81 | if layout_iter.at_last_line() { | ||
82 | break layout_iter.get_baseline(); | ||
83 | } | ||
84 | |||
85 | layout_iter.next_line(); | ||
86 | }; | ||
87 | |||
88 | // TODO: Probably should use the logical extents, but it has weird width | ||
89 | let (_, extents) = layout.get_pixel_extents(); | ||
90 | //let (extents, _) = layout.get_pixel_extents(); | ||
91 | (extents.width as f64, extents.height as f64) | ||
92 | |||
93 | //let (width, height) = layout.get_pixel_size(); | ||
94 | //(width as f64, height as f64) | ||
95 | } | ||
96 | |||
97 | fn show_text(&mut self, text: &str, font: &DefinedFontDescription) { | ||
98 | let layout = pangocairo::create_layout(&self.ctx).expect("Couldn't create layout"); | ||
99 | let mut font_desc = pango::FontDescription::from_string(&font.family); | ||
100 | |||
101 | // TODO: I have no fucking idea why | ||
102 | font_desc.set_size((font.size * 600.) as _); | ||
103 | //font_desc.set_size((font.size * 700.) as _); | ||
104 | //font_desc.set_absolute_size(font.size * 800.); | ||
105 | layout.set_font_description(Some(&font_desc)); | ||
106 | layout.set_markup(text); | ||
107 | |||
108 | //self.ctx.set_font_size(dbg!(font.size)); | ||
109 | pangocairo::show_layout(&self.ctx, &layout); | ||
110 | } | ||
111 | } | ||