|
| 1 | +// Take a look at the license at the top of the repository in the LICENSE file. |
| 2 | + |
| 3 | +use crate::{ffi, RenderNode}; |
| 4 | +use glib::{prelude::*, translate::*}; |
| 5 | +use std::boxed::Box as Box_; |
| 6 | + |
| 7 | +glib::wrapper! { |
| 8 | + #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] |
| 9 | + pub struct RenderReplay(Boxed<ffi::GskRenderReplay>); |
| 10 | + |
| 11 | + match fn { |
| 12 | + free => |ptr| ffi::gsk_render_replay_free(ptr), |
| 13 | + } |
| 14 | +} |
| 15 | + |
| 16 | +impl RenderReplay { |
| 17 | + #[doc(alias = "gsk_render_replay_default")] |
| 18 | + #[allow(clippy::should_implement_trait)] |
| 19 | + pub fn default(&mut self, node: impl AsRef<RenderNode>) -> Option<RenderNode> { |
| 20 | + unsafe { |
| 21 | + from_glib_full(ffi::gsk_render_replay_default( |
| 22 | + self.to_glib_none_mut().0, |
| 23 | + node.as_ref().to_glib_none().0, |
| 24 | + )) |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + #[doc(alias = "gsk_render_replay_filter_font")] |
| 29 | + pub fn filter_font(&mut self, font: &impl IsA<pango::Font>) -> pango::Font { |
| 30 | + unsafe { |
| 31 | + from_glib_full(ffi::gsk_render_replay_filter_font( |
| 32 | + self.to_glib_none_mut().0, |
| 33 | + font.as_ref().to_glib_none().0, |
| 34 | + )) |
| 35 | + } |
| 36 | + } |
| 37 | + |
| 38 | + #[doc(alias = "gsk_render_replay_filter_node")] |
| 39 | + pub fn filter_node(&mut self, node: impl AsRef<RenderNode>) -> Option<RenderNode> { |
| 40 | + unsafe { |
| 41 | + from_glib_full(ffi::gsk_render_replay_filter_node( |
| 42 | + self.to_glib_none_mut().0, |
| 43 | + node.as_ref().to_glib_none().0, |
| 44 | + )) |
| 45 | + } |
| 46 | + } |
| 47 | + |
| 48 | + #[doc(alias = "gsk_render_replay_filter_texture")] |
| 49 | + pub fn filter_texture(&mut self, texture: &impl IsA<gdk::Texture>) -> gdk::Texture { |
| 50 | + unsafe { |
| 51 | + from_glib_full(ffi::gsk_render_replay_filter_texture( |
| 52 | + self.to_glib_none_mut().0, |
| 53 | + texture.as_ref().to_glib_none().0, |
| 54 | + )) |
| 55 | + } |
| 56 | + } |
| 57 | + |
| 58 | + #[doc(alias = "gsk_render_replay_foreach_node")] |
| 59 | + pub fn foreach_node(&mut self, node: impl AsRef<RenderNode>) { |
| 60 | + unsafe { |
| 61 | + ffi::gsk_render_replay_foreach_node( |
| 62 | + self.to_glib_none_mut().0, |
| 63 | + node.as_ref().to_glib_none().0, |
| 64 | + ); |
| 65 | + } |
| 66 | + } |
| 67 | + |
| 68 | + #[doc(alias = "gsk_render_replay_set_font_filter")] |
| 69 | + pub fn set_font_filter( |
| 70 | + &mut self, |
| 71 | + filter: Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>, |
| 72 | + ) { |
| 73 | + let filter_data: Box_< |
| 74 | + Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>, |
| 75 | + > = Box_::new(filter); |
| 76 | + unsafe extern "C" fn filter_func( |
| 77 | + replay: *mut ffi::GskRenderReplay, |
| 78 | + font: *mut pango::ffi::PangoFont, |
| 79 | + user_data: glib::ffi::gpointer, |
| 80 | + ) -> *mut pango::ffi::PangoFont { |
| 81 | + let replay = from_glib_borrow(replay); |
| 82 | + let font = from_glib_borrow(font); |
| 83 | + let callback = &*(user_data |
| 84 | + as *mut Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>); |
| 85 | + if let Some(ref callback) = *callback { |
| 86 | + callback(&replay, &font) |
| 87 | + } else { |
| 88 | + panic!("cannot get closure...") |
| 89 | + } |
| 90 | + .to_glib_full() |
| 91 | + } |
| 92 | + let filter = if filter_data.is_some() { |
| 93 | + Some(filter_func as _) |
| 94 | + } else { |
| 95 | + None |
| 96 | + }; |
| 97 | + unsafe extern "C" fn user_destroy_func(data: glib::ffi::gpointer) { |
| 98 | + let _callback = Box_::from_raw( |
| 99 | + data as *mut Option< |
| 100 | + Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>, |
| 101 | + >, |
| 102 | + ); |
| 103 | + } |
| 104 | + let destroy_call3 = Some(user_destroy_func as _); |
| 105 | + let super_callback0: Box_< |
| 106 | + Option<Box_<dyn Fn(&RenderReplay, &pango::Font) -> pango::Font + 'static>>, |
| 107 | + > = filter_data; |
| 108 | + unsafe { |
| 109 | + ffi::gsk_render_replay_set_font_filter( |
| 110 | + self.to_glib_none_mut().0, |
| 111 | + filter, |
| 112 | + Box_::into_raw(super_callback0) as *mut _, |
| 113 | + destroy_call3, |
| 114 | + ); |
| 115 | + } |
| 116 | + } |
| 117 | + |
| 118 | + #[doc(alias = "gsk_render_replay_set_node_filter")] |
| 119 | + pub fn set_node_filter<P: Fn(&RenderReplay, &RenderNode) -> Option<RenderNode> + 'static>( |
| 120 | + &mut self, |
| 121 | + filter: P, |
| 122 | + ) { |
| 123 | + let filter_data: Box_<P> = Box_::new(filter); |
| 124 | + unsafe extern "C" fn filter_func< |
| 125 | + P: Fn(&RenderReplay, &RenderNode) -> Option<RenderNode> + 'static, |
| 126 | + >( |
| 127 | + replay: *mut ffi::GskRenderReplay, |
| 128 | + node: *mut ffi::GskRenderNode, |
| 129 | + user_data: glib::ffi::gpointer, |
| 130 | + ) -> *mut ffi::GskRenderNode { |
| 131 | + let replay = from_glib_borrow(replay); |
| 132 | + let node = from_glib_borrow(node); |
| 133 | + let callback = &*(user_data as *mut P); |
| 134 | + (*callback)(&replay, &node).to_glib_full() |
| 135 | + } |
| 136 | + let filter = Some(filter_func::<P> as _); |
| 137 | + unsafe extern "C" fn user_destroy_func< |
| 138 | + P: Fn(&RenderReplay, &RenderNode) -> Option<RenderNode> + 'static, |
| 139 | + >( |
| 140 | + data: glib::ffi::gpointer, |
| 141 | + ) { |
| 142 | + let _callback = Box_::from_raw(data as *mut P); |
| 143 | + } |
| 144 | + let destroy_call3 = Some(user_destroy_func::<P> as _); |
| 145 | + let super_callback0: Box_<P> = filter_data; |
| 146 | + unsafe { |
| 147 | + ffi::gsk_render_replay_set_node_filter( |
| 148 | + self.to_glib_none_mut().0, |
| 149 | + filter, |
| 150 | + Box_::into_raw(super_callback0) as *mut _, |
| 151 | + destroy_call3, |
| 152 | + ); |
| 153 | + } |
| 154 | + } |
| 155 | + |
| 156 | + #[doc(alias = "gsk_render_replay_set_node_foreach")] |
| 157 | + pub fn set_node_foreach<P: Fn(&RenderReplay, &RenderNode) -> bool + 'static>( |
| 158 | + &mut self, |
| 159 | + foreach: P, |
| 160 | + ) { |
| 161 | + let foreach_data: Box_<P> = Box_::new(foreach); |
| 162 | + unsafe extern "C" fn foreach_func<P: Fn(&RenderReplay, &RenderNode) -> bool + 'static>( |
| 163 | + replay: *mut ffi::GskRenderReplay, |
| 164 | + node: *mut ffi::GskRenderNode, |
| 165 | + user_data: glib::ffi::gpointer, |
| 166 | + ) -> glib::ffi::gboolean { |
| 167 | + let replay = from_glib_borrow(replay); |
| 168 | + let node = from_glib_borrow(node); |
| 169 | + let callback = &*(user_data as *mut P); |
| 170 | + (*callback)(&replay, &node).into_glib() |
| 171 | + } |
| 172 | + let foreach = Some(foreach_func::<P> as _); |
| 173 | + unsafe extern "C" fn user_destroy_func< |
| 174 | + P: Fn(&RenderReplay, &RenderNode) -> bool + 'static, |
| 175 | + >( |
| 176 | + data: glib::ffi::gpointer, |
| 177 | + ) { |
| 178 | + let _callback = Box_::from_raw(data as *mut P); |
| 179 | + } |
| 180 | + let destroy_call3 = Some(user_destroy_func::<P> as _); |
| 181 | + let super_callback0: Box_<P> = foreach_data; |
| 182 | + unsafe { |
| 183 | + ffi::gsk_render_replay_set_node_foreach( |
| 184 | + self.to_glib_none_mut().0, |
| 185 | + foreach, |
| 186 | + Box_::into_raw(super_callback0) as *mut _, |
| 187 | + destroy_call3, |
| 188 | + ); |
| 189 | + } |
| 190 | + } |
| 191 | + |
| 192 | + #[doc(alias = "gsk_render_replay_set_texture_filter")] |
| 193 | + pub fn set_texture_filter( |
| 194 | + &mut self, |
| 195 | + filter: Option<Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>>, |
| 196 | + ) { |
| 197 | + let filter_data: Box_< |
| 198 | + Option<Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>>, |
| 199 | + > = Box_::new(filter); |
| 200 | + unsafe extern "C" fn filter_func( |
| 201 | + replay: *mut ffi::GskRenderReplay, |
| 202 | + texture: *mut gdk::ffi::GdkTexture, |
| 203 | + user_data: glib::ffi::gpointer, |
| 204 | + ) -> *mut gdk::ffi::GdkTexture { |
| 205 | + let replay = from_glib_borrow(replay); |
| 206 | + let texture = from_glib_borrow(texture); |
| 207 | + let callback = &*(user_data |
| 208 | + as *mut Option< |
| 209 | + Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>, |
| 210 | + >); |
| 211 | + if let Some(ref callback) = *callback { |
| 212 | + callback(&replay, &texture) |
| 213 | + } else { |
| 214 | + panic!("cannot get closure...") |
| 215 | + } |
| 216 | + .to_glib_full() |
| 217 | + } |
| 218 | + let filter = if filter_data.is_some() { |
| 219 | + Some(filter_func as _) |
| 220 | + } else { |
| 221 | + None |
| 222 | + }; |
| 223 | + unsafe extern "C" fn user_destroy_func(data: glib::ffi::gpointer) { |
| 224 | + let _callback = Box_::from_raw( |
| 225 | + data as *mut Option< |
| 226 | + Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>, |
| 227 | + >, |
| 228 | + ); |
| 229 | + } |
| 230 | + let destroy_call3 = Some(user_destroy_func as _); |
| 231 | + let super_callback0: Box_< |
| 232 | + Option<Box_<dyn Fn(&RenderReplay, &gdk::Texture) -> gdk::Texture + 'static>>, |
| 233 | + > = filter_data; |
| 234 | + unsafe { |
| 235 | + ffi::gsk_render_replay_set_texture_filter( |
| 236 | + self.to_glib_none_mut().0, |
| 237 | + filter, |
| 238 | + Box_::into_raw(super_callback0) as *mut _, |
| 239 | + destroy_call3, |
| 240 | + ); |
| 241 | + } |
| 242 | + } |
| 243 | + |
| 244 | + #[doc(alias = "gsk_render_replay_new")] |
| 245 | + pub fn new() -> RenderReplay { |
| 246 | + assert_initialized_main_thread!(); |
| 247 | + unsafe { from_glib_none(ffi::gsk_render_replay_new()) } |
| 248 | + } |
| 249 | +} |
| 250 | + |
| 251 | +#[cfg(feature = "v4_22")] |
| 252 | +#[cfg_attr(docsrs, doc(cfg(feature = "v4_22")))] |
| 253 | +impl Default for RenderReplay { |
| 254 | + fn default() -> Self { |
| 255 | + Self::new() |
| 256 | + } |
| 257 | +} |
0 commit comments