summaryrefslogtreecommitdiffstats
path: root/cairo-renderer/src/lib.rs
diff options
context:
space:
mode:
authorMinijackson <minijackson@riseup.net>2022-12-22 12:19:59 +0100
committerMinijackson <minijackson@riseup.net>2022-12-22 12:19:59 +0100
commit92a02c34628343153b33602eae00cef46e28d191 (patch)
tree8622ec528d24e456be22d984d93aa9bcafc97399 /cairo-renderer/src/lib.rs
downloaddiaphragm-92a02c34628343153b33602eae00cef46e28d191.tar.gz
diaphragm-92a02c34628343153b33602eae00cef46e28d191.zip
WIP
Diffstat (limited to 'cairo-renderer/src/lib.rs')
-rw-r--r--cairo-renderer/src/lib.rs111
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 @@
1use diaphragm_core::{
2 styles::{Pattern, DefinedDashStyle},
3 text::{DefinedFontDescription, FontDescription},
4 Renderer,
5};
6
7pub struct CairoRenderer {
8 ctx: cairo::Context,
9}
10
11impl 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
21impl 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}