1use crate::{RenderNodeType, ffi};
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 #[cfg(feature = "v4_22")]
51 #[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))]
52 #[doc(alias = "gsk_render_node_get_children")]
53 #[doc(alias = "get_children")]
54 pub fn children(&self) -> Vec<RenderNode> {
55 unsafe {
56 let mut n_children = std::mem::MaybeUninit::uninit();
57 let ret = FromGlibContainer::from_glib_none_num(
58 ffi::gsk_render_node_get_children(
59 self.as_ref().to_glib_none().0,
60 n_children.as_mut_ptr(),
61 ),
62 n_children.assume_init() as _,
63 );
64 ret
65 }
66 }
67
68 #[doc(alias = "gsk_render_node_get_node_type")]
69 #[doc(alias = "get_node_type")]
70 pub fn node_type(&self) -> RenderNodeType {
71 unsafe {
72 from_glib(ffi::gsk_render_node_get_node_type(const_override(
73 self.as_ref().to_glib_none().0,
74 )))
75 }
76 }
77
78 #[cfg(feature = "v4_16")]
79 #[cfg_attr(docsrs, doc(cfg(feature = "v4_16")))]
80 #[doc(alias = "gsk_render_node_get_opaque_rect")]
81 #[doc(alias = "get_opaque_rect")]
82 pub fn opaque_rect(&self) -> Option<graphene::Rect> {
83 unsafe {
84 let mut out_opaque = graphene::Rect::uninitialized();
85 let ret = from_glib(ffi::gsk_render_node_get_opaque_rect(
86 self.as_ref().to_glib_none().0,
87 out_opaque.to_glib_none_mut().0,
88 ));
89 if ret { Some(out_opaque) } else { None }
90 }
91 }
92
93 #[doc(alias = "gsk_render_node_serialize")]
94 pub fn serialize(&self) -> glib::Bytes {
95 unsafe {
96 from_glib_full(ffi::gsk_render_node_serialize(
97 self.as_ref().to_glib_none().0,
98 ))
99 }
100 }
101
102 #[doc(alias = "gsk_render_node_write_to_file")]
103 pub fn write_to_file(&self, filename: impl AsRef<std::path::Path>) -> Result<(), glib::Error> {
104 unsafe {
105 let mut error = std::ptr::null_mut();
106 let is_ok = ffi::gsk_render_node_write_to_file(
107 self.as_ref().to_glib_none().0,
108 filename.as_ref().to_glib_none().0,
109 &mut error,
110 );
111 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
112 if error.is_null() {
113 Ok(())
114 } else {
115 Err(from_glib_full(error))
116 }
117 }
118 }
119}