gdk4/
dmabuf_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, Display, DmabufTextureBuilder, Texture};
8
9impl DmabufTextureBuilder {
10    #[cfg(feature = "v4_16")]
11    #[cfg_attr(docsrs, doc(cfg(feature = "v4_16")))]
12    #[doc(alias = "gdk_dmabuf_texture_builder_set_color_state")]
13    #[doc(alias = "color-state")]
14    pub fn set_color_state(self, color_state: Option<&ColorState>) -> Self {
15        unsafe {
16            ffi::gdk_dmabuf_texture_builder_set_color_state(
17                self.to_glib_none().0,
18                color_state.to_glib_none().0,
19            );
20        }
21
22        self
23    }
24
25    #[doc(alias = "gdk_dmabuf_texture_builder_set_display")]
26    #[doc(alias = "display")]
27    pub fn set_display(self, display: &impl IsA<Display>) -> Self {
28        unsafe {
29            ffi::gdk_dmabuf_texture_builder_set_display(
30                self.to_glib_none().0,
31                display.as_ref().to_glib_none().0,
32            );
33        }
34
35        self
36    }
37
38    // rustdoc-stripper-ignore-next
39    /// # Safety
40    ///
41    /// The caller must ensure that `fd` says valid for at least as long as the texture, e.g. by
42    /// using `build_with_release_func()` to get notified when `fd` is not used anymore.
43    #[doc(alias = "gdk_dmabuf_texture_builder_set_fd")]
44    pub unsafe fn set_fd(self, plane: u32, fd: std::os::fd::RawFd) -> Self {
45        unsafe {
46            ffi::gdk_dmabuf_texture_builder_set_fd(self.to_glib_none().0, plane, fd);
47        }
48
49        self
50    }
51
52    #[doc(alias = "gdk_dmabuf_texture_builder_get_fd")]
53    #[doc(alias = "get_fd")]
54    pub fn fd(&self, plane: u32) -> Option<std::os::fd::BorrowedFd<'_>> {
55        unsafe {
56            let fd = ffi::gdk_dmabuf_texture_builder_get_fd(self.to_glib_none().0, plane);
57
58            if fd == -1 {
59                None
60            } else {
61                Some(std::os::fd::BorrowedFd::borrow_raw(fd))
62            }
63        }
64    }
65
66    #[doc(alias = "gdk_dmabuf_texture_builder_set_fourcc")]
67    #[doc(alias = "fourcc")]
68    pub fn set_fourcc(self, fourcc: u32) -> Self {
69        unsafe {
70            ffi::gdk_dmabuf_texture_builder_set_fourcc(self.to_glib_none().0, fourcc);
71        }
72
73        self
74    }
75
76    #[doc(alias = "gdk_dmabuf_texture_builder_set_height")]
77    #[doc(alias = "height")]
78    pub fn set_height(self, height: u32) -> Self {
79        unsafe {
80            ffi::gdk_dmabuf_texture_builder_set_height(self.to_glib_none().0, height);
81        }
82
83        self
84    }
85
86    #[doc(alias = "gdk_dmabuf_texture_builder_set_modifier")]
87    #[doc(alias = "modifier")]
88    pub fn set_modifier(self, modifier: u64) -> Self {
89        unsafe {
90            ffi::gdk_dmabuf_texture_builder_set_modifier(self.to_glib_none().0, modifier);
91        }
92
93        self
94    }
95
96    #[doc(alias = "gdk_dmabuf_texture_builder_set_n_planes")]
97    #[doc(alias = "n-planes")]
98    pub fn set_n_planes(self, n_planes: u32) -> Self {
99        unsafe {
100            ffi::gdk_dmabuf_texture_builder_set_n_planes(self.to_glib_none().0, n_planes);
101        }
102
103        self
104    }
105
106    #[doc(alias = "gdk_dmabuf_texture_builder_set_offset")]
107    pub fn set_offset(self, plane: u32, offset: u32) -> Self {
108        unsafe {
109            ffi::gdk_dmabuf_texture_builder_set_offset(self.to_glib_none().0, plane, offset);
110        }
111
112        self
113    }
114
115    #[doc(alias = "gdk_dmabuf_texture_builder_set_premultiplied")]
116    #[doc(alias = "premultiplied")]
117    pub fn set_premultiplied(self, premultiplied: bool) -> Self {
118        unsafe {
119            ffi::gdk_dmabuf_texture_builder_set_premultiplied(
120                self.to_glib_none().0,
121                premultiplied.into_glib(),
122            );
123        }
124
125        self
126    }
127
128    #[doc(alias = "gdk_dmabuf_texture_builder_set_stride")]
129    pub fn set_stride(self, plane: u32, stride: u32) -> Self {
130        unsafe {
131            ffi::gdk_dmabuf_texture_builder_set_stride(self.to_glib_none().0, plane, stride);
132        }
133
134        self
135    }
136
137    #[doc(alias = "gdk_dmabuf_texture_builder_set_update_region")]
138    #[doc(alias = "update-region")]
139    pub fn set_update_region(self, region: Option<&cairo::Region>) -> Self {
140        unsafe {
141            ffi::gdk_dmabuf_texture_builder_set_update_region(
142                self.to_glib_none().0,
143                mut_override(region.to_glib_none().0),
144            );
145        }
146
147        self
148    }
149
150    #[doc(alias = "gdk_dmabuf_texture_builder_set_update_texture")]
151    #[doc(alias = "update-texture")]
152    pub fn set_update_texture(self, texture: Option<&impl IsA<Texture>>) -> Self {
153        unsafe {
154            ffi::gdk_dmabuf_texture_builder_set_update_texture(
155                self.to_glib_none().0,
156                texture.map(|p| p.as_ref()).to_glib_none().0,
157            );
158        }
159
160        self
161    }
162
163    #[doc(alias = "gdk_dmabuf_texture_builder_set_width")]
164    #[doc(alias = "width")]
165    pub fn set_width(self, width: u32) -> Self {
166        unsafe {
167            ffi::gdk_dmabuf_texture_builder_set_width(self.to_glib_none().0, width);
168        }
169
170        self
171    }
172
173    #[doc(alias = "gdk_dmabuf_texture_builder_build")]
174    #[must_use = "The builder must be built to be used"]
175    #[allow(clippy::missing_safety_doc)]
176    pub unsafe fn build(self) -> Result<Texture, glib::Error> {
177        let mut error = std::ptr::null_mut();
178
179        let result = ffi::gdk_dmabuf_texture_builder_build(
180            self.to_glib_none().0,
181            None,
182            std::ptr::null_mut(),
183            &mut error,
184        );
185        if error.is_null() {
186            if result.is_null() {
187                Err(glib::Error::new(
188                    crate::DmabufError::UnsupportedFormat,
189                    "Unsupported format",
190                ))
191            } else {
192                Ok(from_glib_full(result))
193            }
194        } else {
195            Err(from_glib_full(error))
196        }
197    }
198
199    #[doc(alias = "gdk_dmabuf_texture_builder_build")]
200    #[must_use = "The builder must be built to be used"]
201    #[allow(clippy::missing_safety_doc)]
202    pub unsafe fn build_with_release_func<F: FnOnce() + Send + 'static>(
203        self,
204        release_func: F,
205    ) -> Result<Texture, glib::Error> {
206        let mut error = std::ptr::null_mut();
207        unsafe extern "C" fn destroy_closure<F: FnOnce() + Send + 'static>(
208            func: glib::ffi::gpointer,
209        ) {
210            let released_func = Box::<F>::from_raw(func as *mut _);
211            released_func();
212        }
213        let released_func = Box::new(release_func);
214        let result = ffi::gdk_dmabuf_texture_builder_build(
215            self.to_glib_none().0,
216            Some(destroy_closure::<F>),
217            Box::into_raw(released_func) as glib::ffi::gpointer,
218            &mut error,
219        );
220        if error.is_null() {
221            if result.is_null() {
222                Err(glib::Error::new(
223                    crate::DmabufError::UnsupportedFormat,
224                    "Unsupported format",
225                ))
226            } else {
227                Ok(from_glib_full(result))
228            }
229        } else {
230            Err(from_glib_full(error))
231        }
232    }
233}