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