gdk4/
gl_texture_builder.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::{prelude::*, translate::*};
4
5#[cfg(feature = "v4_16")]
6use crate::ColorState;
7use crate::{ffi, GLContext, GLTextureBuilder, MemoryFormat, Texture};
8
9#[cfg(not(feature = "gl"))]
10pub type GLsync = *const libc::c_void;
11
12#[cfg(feature = "gl")]
13pub use gl::types::GLsync;
14
15impl GLTextureBuilder {
16    #[doc(alias = "gdk_gl_texture_builder_build")]
17    #[must_use = "The builder must be built to be used"]
18    #[allow(clippy::missing_safety_doc)]
19    pub unsafe fn build(self) -> Texture {
20        from_glib_full(ffi::gdk_gl_texture_builder_build(
21            self.to_glib_none().0,
22            None,
23            std::ptr::null_mut(),
24        ))
25    }
26
27    #[doc(alias = "gdk_gl_texture_builder_build")]
28    #[must_use = "The builder must be built to be used"]
29    #[allow(clippy::missing_safety_doc)]
30    pub unsafe fn build_with_release_func<F: FnOnce() + Send + 'static>(
31        self,
32        release_func: F,
33    ) -> Texture {
34        unsafe extern "C" fn destroy_closure<F: FnOnce() + Send + 'static>(
35            func: glib::ffi::gpointer,
36        ) {
37            let released_func = Box::<F>::from_raw(func as *mut _);
38            released_func();
39        }
40        let released_func = Box::new(release_func);
41        from_glib_full(ffi::gdk_gl_texture_builder_build(
42            self.to_glib_none().0,
43            Some(destroy_closure::<F>),
44            Box::into_raw(released_func) as glib::ffi::gpointer,
45        ))
46    }
47
48    #[cfg(feature = "v4_16")]
49    #[cfg_attr(docsrs, doc(cfg(feature = "v4_16")))]
50    #[doc(alias = "gdk_gl_texture_builder_set_color_state")]
51    #[doc(alias = "color-state")]
52    pub fn set_color_state(self, color_state: &ColorState) -> Self {
53        unsafe {
54            ffi::gdk_gl_texture_builder_set_color_state(
55                self.to_glib_none().0,
56                color_state.to_glib_none().0,
57            );
58        }
59
60        self
61    }
62
63    #[doc(alias = "gdk_gl_texture_builder_set_context")]
64    pub fn set_context(self, context: Option<&impl IsA<GLContext>>) -> Self {
65        unsafe {
66            ffi::gdk_gl_texture_builder_set_context(
67                self.to_glib_none().0,
68                context.map(|p| p.as_ref()).to_glib_none().0,
69            );
70        }
71
72        self
73    }
74
75    #[doc(alias = "gdk_gl_texture_builder_set_format")]
76    pub fn set_format(self, format: MemoryFormat) -> Self {
77        unsafe {
78            ffi::gdk_gl_texture_builder_set_format(self.to_glib_none().0, format.into_glib());
79        }
80
81        self
82    }
83
84    #[doc(alias = "gdk_gl_texture_builder_set_has_mipmap")]
85    pub fn set_has_mipmap(self, has_mipmap: bool) -> Self {
86        unsafe {
87            ffi::gdk_gl_texture_builder_set_has_mipmap(
88                self.to_glib_none().0,
89                has_mipmap.into_glib(),
90            );
91        }
92
93        self
94    }
95
96    #[doc(alias = "gdk_gl_texture_builder_set_height")]
97    pub fn set_height(self, height: i32) -> Self {
98        unsafe {
99            ffi::gdk_gl_texture_builder_set_height(self.to_glib_none().0, height);
100        }
101
102        self
103    }
104
105    #[doc(alias = "gdk_gl_texture_builder_set_id")]
106    pub fn set_id(self, id: u32) -> Self {
107        unsafe {
108            ffi::gdk_gl_texture_builder_set_id(self.to_glib_none().0, id);
109        }
110
111        self
112    }
113
114    #[doc(alias = "gdk_gl_texture_builder_set_update_region")]
115    pub fn set_update_region(self, region: Option<&cairo::Region>) -> Self {
116        unsafe {
117            ffi::gdk_gl_texture_builder_set_update_region(
118                self.to_glib_none().0,
119                mut_override(region.to_glib_none().0),
120            );
121        }
122
123        self
124    }
125
126    #[doc(alias = "gdk_gl_texture_builder_set_update_texture")]
127    pub fn set_update_texture(self, texture: Option<&impl IsA<Texture>>) -> Self {
128        unsafe {
129            ffi::gdk_gl_texture_builder_set_update_texture(
130                self.to_glib_none().0,
131                texture.map(|p| p.as_ref()).to_glib_none().0,
132            );
133        }
134
135        self
136    }
137
138    #[doc(alias = "gdk_gl_texture_builder_set_width")]
139    pub fn set_width(self, width: i32) -> Self {
140        unsafe {
141            ffi::gdk_gl_texture_builder_set_width(self.to_glib_none().0, width);
142        }
143
144        self
145    }
146
147    #[doc(alias = "gdk_gl_texture_builder_get_sync")]
148    #[doc(alias = "get_sync")]
149    pub fn sync(&self) -> Option<GLsync> {
150        let ptr = unsafe { ffi::gdk_gl_texture_builder_get_sync(self.to_glib_none().0) };
151        if ptr.is_null() {
152            None
153        } else {
154            Some(ptr as _)
155        }
156    }
157
158    #[doc(alias = "gdk_gl_texture_builder_set_sync")]
159    pub fn set_sync(self, sync: Option<GLsync>) -> Self {
160        let ptr = sync.unwrap_or(std::ptr::null());
161        unsafe {
162            ffi::gdk_gl_texture_builder_set_sync(self.to_glib_none().0, ptr as _);
163        }
164
165        self
166    }
167}