summaryrefslogtreecommitdiffstats
path: root/cairo-renderer/src
diff options
context:
space:
mode:
Diffstat (limited to 'cairo-renderer/src')
-rw-r--r--cairo-renderer/src/drawing/cairo/mod.rs35
-rw-r--r--cairo-renderer/src/drawing/mod.rs8
-rw-r--r--cairo-renderer/src/lib.rs111
3 files changed, 154 insertions, 0 deletions
diff --git a/cairo-renderer/src/drawing/cairo/mod.rs b/cairo-renderer/src/drawing/cairo/mod.rs
new file mode 100644
index 0000000..09baa9c
--- /dev/null
+++ b/cairo-renderer/src/drawing/cairo/mod.rs
@@ -0,0 +1,35 @@
1use super::Engine;
2use crate::core::{shapes::Shape as CoreShape, types::DefinitelyBounded};
3
4use cairo::Context;
5
6pub struct CairoEngine {
7 ctx: Context,
8}
9
10impl Engine for CairoEngine {
11 fn new() -> Self {
12 let surface = cairo::SvgSurface::for_stream(200., 100., std::io::stdout()).unwrap();
13 let ctx = cairo::Context::new(&surface);
14
15 CairoEngine { ctx }
16 }
17
18 fn draw(&mut self, shape: &DefinitelyBounded<CoreShape>) {
19 let bounds = &shape.bounds;
20
21 self.ctx.move_to(bounds.left, bounds.top);
22
23 match &shape.shape {
24 CoreShape::Rectangle(_rectangle) => {
25 self.ctx
26 .rectangle(bounds.left, bounds.top, bounds.width, bounds.height);
27 self.ctx.stroke();
28 }
29 CoreShape::Text(text) => {
30 // TODO: properly shape it, with font, etc.
31 self.ctx.show_text(&text.content);
32 }
33 }
34 }
35}
diff --git a/cairo-renderer/src/drawing/mod.rs b/cairo-renderer/src/drawing/mod.rs
new file mode 100644
index 0000000..1c32fb1
--- /dev/null
+++ b/cairo-renderer/src/drawing/mod.rs
@@ -0,0 +1,8 @@
1pub mod cairo;
2
3use crate::core::{shapes::Shape as CoreShape, types::DefinitelyBounded};
4
5pub trait Engine {
6 fn new() -> Self;
7 fn draw(&mut self, shape: &DefinitelyBounded<CoreShape>);
8}
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}