gdk4/
dmabuf_texture_builder.rs1use 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 #[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}