clutter/auto/
deform_effect.rs

1use crate::{ActorMeta, Effect, OffscreenEffect};
2use glib::{
3    object as gobject,
4    object::{Cast, IsA},
5    signal::{connect_raw, SignalHandlerId},
6    translate::*,
7    StaticType, Value,
8};
9use std::boxed::Box as Box_;
10use std::{fmt, mem, mem::transmute};
11
12glib_wrapper! {
13    pub struct DeformEffect(Object<ffi::ClutterDeformEffect, ffi::ClutterDeformEffectClass, DeformEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
14
15    match fn {
16        get_type => || ffi::clutter_deform_effect_get_type(),
17    }
18}
19
20pub const NONE_DEFORM_EFFECT: Option<&DeformEffect> = None;
21
22/// Trait containing all `DeformEffect` methods.
23///
24/// # Implementors
25///
26/// [`DeformEffect`](struct.DeformEffect.html), [`PageTurnEffect`](struct.PageTurnEffect.html)
27pub trait DeformEffectExt: 'static {
28    //fn get_back_material(&self) -> /*Unimplemented*/Option<cogl::Handle>;
29
30    /// Retrieves the number of horizontal and vertical tiles used to sub-divide
31    /// the actor's geometry during the effect
32    /// ## `x_tiles`
33    /// return location for the number of horizontal tiles,
34    ///  or `None`
35    /// ## `y_tiles`
36    /// return location for the number of vertical tiles,
37    ///  or `None`
38    fn get_n_tiles(&self) -> (u32, u32);
39
40    /// Invalidates the `self`<!-- -->'s vertices and, if it is associated
41    /// to an actor, it will queue a redraw
42    fn invalidate(&self);
43
44    //fn set_back_material(&self, material: /*Unimplemented*/Option<cogl::Handle>);
45
46    /// Sets the number of horizontal and vertical tiles to be used
47    /// when applying the effect
48    ///
49    /// More tiles allow a finer grained deformation at the expenses
50    /// of computation
51    /// ## `x_tiles`
52    /// number of horizontal tiles
53    /// ## `y_tiles`
54    /// number of vertical tiles
55    fn set_n_tiles(&self, x_tiles: u32, y_tiles: u32);
56
57    /// The number of horizontal tiles. The bigger the number, the
58    /// smaller the tiles
59    fn get_property_x_tiles(&self) -> u32;
60
61    /// The number of horizontal tiles. The bigger the number, the
62    /// smaller the tiles
63    fn set_property_x_tiles(&self, x_tiles: u32);
64
65    /// The number of vertical tiles. The bigger the number, the
66    /// smaller the tiles
67    fn get_property_y_tiles(&self) -> u32;
68
69    /// The number of vertical tiles. The bigger the number, the
70    /// smaller the tiles
71    fn set_property_y_tiles(&self, y_tiles: u32);
72
73    fn connect_property_x_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
74
75    fn connect_property_y_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
76}
77
78impl<O: IsA<DeformEffect>> DeformEffectExt for O {
79    //fn get_back_material(&self) -> /*Unimplemented*/Option<cogl::Handle> {
80    //    unsafe { TODO: call clutter_sys:clutter_deform_effect_get_back_material() }
81    //}
82
83    fn get_n_tiles(&self) -> (u32, u32) {
84        unsafe {
85            let mut x_tiles = mem::MaybeUninit::uninit();
86            let mut y_tiles = mem::MaybeUninit::uninit();
87            ffi::clutter_deform_effect_get_n_tiles(
88                self.as_ref().to_glib_none().0,
89                x_tiles.as_mut_ptr(),
90                y_tiles.as_mut_ptr(),
91            );
92            let x_tiles = x_tiles.assume_init();
93            let y_tiles = y_tiles.assume_init();
94            (x_tiles, y_tiles)
95        }
96    }
97
98    fn invalidate(&self) {
99        unsafe {
100            ffi::clutter_deform_effect_invalidate(self.as_ref().to_glib_none().0);
101        }
102    }
103
104    //fn set_back_material(&self, material: /*Unimplemented*/Option<cogl::Handle>) {
105    //    unsafe { TODO: call clutter_sys:clutter_deform_effect_set_back_material() }
106    //}
107
108    fn set_n_tiles(&self, x_tiles: u32, y_tiles: u32) {
109        unsafe {
110            ffi::clutter_deform_effect_set_n_tiles(
111                self.as_ref().to_glib_none().0,
112                x_tiles,
113                y_tiles,
114            );
115        }
116    }
117
118    fn get_property_x_tiles(&self) -> u32 {
119        unsafe {
120            let mut value = Value::from_type(<u32 as StaticType>::static_type());
121            gobject_sys::g_object_get_property(
122                self.to_glib_none().0 as *mut gobject_sys::GObject,
123                b"x-tiles\0".as_ptr() as *const _,
124                value.to_glib_none_mut().0,
125            );
126            value
127                .get()
128                .expect("Return Value for property `x-tiles` getter")
129                .unwrap()
130        }
131    }
132
133    fn set_property_x_tiles(&self, x_tiles: u32) {
134        unsafe {
135            gobject_sys::g_object_set_property(
136                self.to_glib_none().0 as *mut gobject_sys::GObject,
137                b"x-tiles\0".as_ptr() as *const _,
138                Value::from(&x_tiles).to_glib_none().0,
139            );
140        }
141    }
142
143    fn get_property_y_tiles(&self) -> u32 {
144        unsafe {
145            let mut value = Value::from_type(<u32 as StaticType>::static_type());
146            gobject_sys::g_object_get_property(
147                self.to_glib_none().0 as *mut gobject_sys::GObject,
148                b"y-tiles\0".as_ptr() as *const _,
149                value.to_glib_none_mut().0,
150            );
151            value
152                .get()
153                .expect("Return Value for property `y-tiles` getter")
154                .unwrap()
155        }
156    }
157
158    fn set_property_y_tiles(&self, y_tiles: u32) {
159        unsafe {
160            gobject_sys::g_object_set_property(
161                self.to_glib_none().0 as *mut gobject_sys::GObject,
162                b"y-tiles\0".as_ptr() as *const _,
163                Value::from(&y_tiles).to_glib_none().0,
164            );
165        }
166    }
167
168    fn connect_property_x_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
169        unsafe extern "C" fn notify_x_tiles_trampoline<P, F: Fn(&P) + 'static>(
170            this: *mut ffi::ClutterDeformEffect,
171            _param_spec: glib_sys::gpointer,
172            f: glib_sys::gpointer,
173        ) where
174            P: IsA<DeformEffect>,
175        {
176            let f: &F = &*(f as *const F);
177            f(&DeformEffect::from_glib_borrow(this).unsafe_cast_ref())
178        }
179        unsafe {
180            let f: Box_<F> = Box_::new(f);
181            connect_raw(
182                self.as_ptr() as *mut _,
183                b"notify::x-tiles\0".as_ptr() as *const _,
184                Some(transmute::<_, unsafe extern "C" fn()>(
185                    notify_x_tiles_trampoline::<Self, F> as *const (),
186                )),
187                Box_::into_raw(f),
188            )
189        }
190    }
191
192    fn connect_property_y_tiles_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
193        unsafe extern "C" fn notify_y_tiles_trampoline<P, F: Fn(&P) + 'static>(
194            this: *mut ffi::ClutterDeformEffect,
195            _param_spec: glib_sys::gpointer,
196            f: glib_sys::gpointer,
197        ) where
198            P: IsA<DeformEffect>,
199        {
200            let f: &F = &*(f as *const F);
201            f(&DeformEffect::from_glib_borrow(this).unsafe_cast_ref())
202        }
203        unsafe {
204            let f: Box_<F> = Box_::new(f);
205            connect_raw(
206                self.as_ptr() as *mut _,
207                b"notify::y-tiles\0".as_ptr() as *const _,
208                Some(transmute::<_, unsafe extern "C" fn()>(
209                    notify_y_tiles_trampoline::<Self, F> as *const (),
210                )),
211                Box_::into_raw(f),
212            )
213        }
214    }
215}
216
217impl fmt::Display for DeformEffect {
218    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
219        write!(f, "DeformEffect")
220    }
221}