1use crate::{ffi, RenderNodeType};
6use glib::{prelude::*, translate::*};
7
8glib::wrapper! {
9 #[doc(alias = "GskRenderNode")]
10 pub struct RenderNode(Shared<ffi::GskRenderNode>);
11
12 match fn {
13 ref => |ptr| ffi::gsk_render_node_ref(ptr),
14 unref => |ptr| ffi::gsk_render_node_unref(ptr),
15 }
16}
17
18impl StaticType for RenderNode {
19 fn static_type() -> glib::Type {
20 unsafe { from_glib(ffi::gsk_render_node_get_type()) }
21 }
22}
23
24impl RenderNode {
25 pub const NONE: Option<&'static RenderNode> = None;
26
27 #[doc(alias = "gsk_render_node_draw")]
28 pub fn draw(&self, cr: &cairo::Context) {
29 unsafe {
30 ffi::gsk_render_node_draw(
31 self.as_ref().to_glib_none().0,
32 mut_override(cr.to_glib_none().0),
33 );
34 }
35 }
36
37 #[doc(alias = "gsk_render_node_get_bounds")]
38 #[doc(alias = "get_bounds")]
39 pub fn bounds(&self) -> graphene::Rect {
40 unsafe {
41 let mut bounds = graphene::Rect::uninitialized();
42 ffi::gsk_render_node_get_bounds(
43 self.as_ref().to_glib_none().0,
44 bounds.to_glib_none_mut().0,
45 );
46 bounds
47 }
48 }
49
50 #[doc(alias = "gsk_render_node_get_node_type")]
51 #[doc(alias = "get_node_type")]
52 pub fn node_type(&self) -> RenderNodeType {
53 unsafe {
54 from_glib(ffi::gsk_render_node_get_node_type(const_override(
55 self.as_ref().to_glib_none().0,
56 )))
57 }
58 }
59
60 #[cfg(feature = "v4_16")]
61 #[cfg_attr(docsrs, doc(cfg(feature = "v4_16")))]
62 #[doc(alias = "gsk_render_node_get_opaque_rect")]
63 #[doc(alias = "get_opaque_rect")]
64 pub fn opaque_rect(&self) -> Option<graphene::Rect> {
65 unsafe {
66 let mut out_opaque = graphene::Rect::uninitialized();
67 let ret = from_glib(ffi::gsk_render_node_get_opaque_rect(
68 self.as_ref().to_glib_none().0,
69 out_opaque.to_glib_none_mut().0,
70 ));
71 if ret {
72 Some(out_opaque)
73 } else {
74 None
75 }
76 }
77 }
78
79 #[doc(alias = "gsk_render_node_serialize")]
80 pub fn serialize(&self) -> glib::Bytes {
81 unsafe {
82 from_glib_full(ffi::gsk_render_node_serialize(
83 self.as_ref().to_glib_none().0,
84 ))
85 }
86 }
87
88 #[doc(alias = "gsk_render_node_write_to_file")]
89 pub fn write_to_file(&self, filename: impl AsRef<std::path::Path>) -> Result<(), glib::Error> {
90 unsafe {
91 let mut error = std::ptr::null_mut();
92 let is_ok = ffi::gsk_render_node_write_to_file(
93 self.as_ref().to_glib_none().0,
94 filename.as_ref().to_glib_none().0,
95 &mut error,
96 );
97 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
98 if error.is_null() {
99 Ok(())
100 } else {
101 Err(from_glib_full(error))
102 }
103 }
104 }
105}