simple_window/common/protocols_data/wayland/
wl_shm.rs

1//! shared memory support
2//!
3//! A singleton global object that provides support for shared
4//! memory.
5//!
6//! Clients can create wl_shm_pool objects using the create_pool
7//! request.
8//!
9//! On binding the wl_shm object one or more format events
10//! are emitted to inform clients about the valid pixel formats
11//! that can be used for buffers.
12
13use {super::super::all_types::*, ::wl_client::builder::prelude::*};
14
15static INTERFACE: wl_interface = wl_interface {
16    name: c"wl_shm".as_ptr(),
17    version: 2,
18    method_count: 2,
19    methods: {
20        static MESSAGES: [wl_message; 2] = [
21            wl_message {
22                name: c"create_pool".as_ptr(),
23                signature: c"nhi".as_ptr(),
24                types: {
25                    static TYPES: [Option<&'static wl_interface>; 3] =
26                        [Some(WlShmPool::WL_INTERFACE), None, None];
27                    TYPES.as_ptr().cast()
28                },
29            },
30            wl_message {
31                name: c"release".as_ptr(),
32                signature: c"".as_ptr(),
33                types: {
34                    static TYPES: [Option<&'static wl_interface>; 0] = [];
35                    TYPES.as_ptr().cast()
36                },
37            },
38        ];
39        MESSAGES.as_ptr()
40    },
41    event_count: 1,
42    events: {
43        static MESSAGES: [wl_message; 1] = [wl_message {
44            name: c"format".as_ptr(),
45            signature: c"u".as_ptr(),
46            types: {
47                static TYPES: [Option<&'static wl_interface>; 1] = [None];
48                TYPES.as_ptr().cast()
49            },
50        }];
51        MESSAGES.as_ptr()
52    },
53};
54
55/// An owned wl_shm proxy.
56///
57/// See the documentation of [the module][self] for the interface description.
58#[derive(Clone, Eq, PartialEq)]
59#[repr(transparent)]
60pub struct WlShm {
61    /// This proxy has the interface INTERFACE.
62    proxy: UntypedOwnedProxy,
63}
64
65/// A borrowed wl_shm proxy.
66///
67/// See the documentation of [the module][self] for the interface description.
68#[derive(Eq, PartialEq)]
69#[repr(transparent)]
70pub struct WlShmRef {
71    /// This proxy has the interface INTERFACE.
72    proxy: UntypedBorrowedProxy,
73}
74
75// SAFETY: WlShm is a transparent wrapper around UntypedOwnedProxy
76unsafe impl UntypedOwnedProxyWrapper for WlShm {}
77
78// SAFETY: - INTERFACE is a valid wl_interface
79//         - The only invariant is that self.proxy has a compatible interface
80unsafe impl OwnedProxy for WlShm {
81    const INTERFACE: &'static str = "wl_shm";
82    const WL_INTERFACE: &'static wl_interface = &INTERFACE;
83    const NO_OP_EVENT_HANDLER: Self::NoOpEventHandler =
84        private::EventHandler(private::NoOpEventHandler);
85    const MAX_VERSION: u32 = 2;
86
87    type Borrowed = WlShmRef;
88    type Api = private::ProxyApi;
89    type NoOpEventHandler = private::EventHandler<private::NoOpEventHandler>;
90}
91
92// SAFETY: WlShmRef is a transparent wrapper around UntypedBorrowedProxy
93unsafe impl UntypedBorrowedProxyWrapper for WlShmRef {}
94
95// SAFETY: - The only invariant is that self.proxy has a compatible interface
96unsafe impl BorrowedProxy for WlShmRef {
97    type Owned = WlShm;
98}
99
100impl Deref for WlShm {
101    type Target = WlShmRef;
102
103    fn deref(&self) -> &Self::Target {
104        proxy::low_level::deref(self)
105    }
106}
107
108mod private {
109    pub struct ProxyApi;
110
111    #[allow(dead_code)]
112    pub struct EventHandler<H>(pub(super) H);
113
114    #[allow(dead_code)]
115    pub struct NoOpEventHandler;
116}
117
118impl Debug for WlShm {
119    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
120        write!(f, "wl_shm#{}", self.proxy.id())
121    }
122}
123
124impl Debug for WlShmRef {
125    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
126        write!(f, "wl_shm#{}", self.proxy.id())
127    }
128}
129
130impl PartialEq<WlShmRef> for WlShm {
131    fn eq(&self, other: &WlShmRef) -> bool {
132        self.proxy == other.proxy
133    }
134}
135
136impl PartialEq<WlShm> for WlShmRef {
137    fn eq(&self, other: &WlShm) -> bool {
138        self.proxy == other.proxy
139    }
140}
141
142#[allow(dead_code)]
143impl WlShm {
144    /// Since when the create_pool request is available.
145    #[allow(dead_code)]
146    pub const REQ__CREATE_POOL__SINCE: u32 = 1;
147
148    /// create a shm pool
149    ///
150    /// Create a new wl_shm_pool object.
151    ///
152    /// The pool can be used to create shared memory based buffer
153    /// objects.  The server will mmap size bytes of the passed file
154    /// descriptor, to use as backing memory for the pool.
155    ///
156    /// # Arguments
157    ///
158    /// - `fd`: file descriptor for the pool
159    /// - `size`: pool size, in bytes
160    #[inline]
161    pub fn create_pool(&self, fd: BorrowedFd<'_>, size: i32) -> WlShmPool {
162        let (arg1, arg2) = (fd, size);
163        let mut args = [
164            wl_argument { n: 0 },
165            wl_argument {
166                h: arg1.as_raw_fd(),
167            },
168            wl_argument { i: arg2 },
169        ];
170        // SAFETY: - self.proxy has the interface INTERFACE
171        //         - 0 < INTERFACE.method_count = 2
172        //         - the request signature is `nhi`
173        //         - OwnedProxy::WL_INTERFACE is always a valid interface
174        let data = unsafe {
175            self.proxy
176                .send_constructor::<false>(0, &mut args, WlShmPool::WL_INTERFACE, None)
177        };
178        // SAFETY: data has the interface WlShmPool::WL_INTERFACE
179        unsafe { proxy::low_level::from_untyped_owned(data) }
180    }
181
182    /// Since when the release request is available.
183    #[allow(dead_code)]
184    pub const REQ__RELEASE__SINCE: u32 = 2;
185
186    /// release the shm object
187    ///
188    /// Using this request a client can tell the server that it is not going to
189    /// use the shm object anymore.
190    ///
191    /// Objects created via this interface remain unaffected.
192    #[inline]
193    pub fn release(&self) {
194        let mut args = [];
195        // SAFETY: - self.proxy has the interface INTERFACE
196        //         - 1 < INTERFACE.method_count = 2
197        //         - the request signature is ``
198        unsafe {
199            self.proxy.send_destructor(1, &mut args);
200        }
201    }
202}
203
204#[allow(dead_code)]
205impl WlShmRef {
206    /// create a shm pool
207    ///
208    /// Create a new wl_shm_pool object.
209    ///
210    /// The pool can be used to create shared memory based buffer
211    /// objects.  The server will mmap size bytes of the passed file
212    /// descriptor, to use as backing memory for the pool.
213    ///
214    /// # Arguments
215    ///
216    /// - `_queue`: The queue that the returned proxy is assigned to.
217    /// - `fd`: file descriptor for the pool
218    /// - `size`: pool size, in bytes
219    #[inline]
220    pub fn create_pool(&self, _queue: &Queue, fd: BorrowedFd<'_>, size: i32) -> WlShmPool {
221        let (arg1, arg2) = (fd, size);
222        let mut args = [
223            wl_argument { n: 0 },
224            wl_argument {
225                h: arg1.as_raw_fd(),
226            },
227            wl_argument { i: arg2 },
228        ];
229        // SAFETY: - self.proxy has the interface INTERFACE
230        //         - 0 < INTERFACE.method_count = 2
231        //         - the request signature is `nhi`
232        //         - OwnedProxy::WL_INTERFACE is always a valid interface
233        let data = unsafe {
234            self.proxy
235                .send_constructor(_queue, 0, &mut args, WlShmPool::WL_INTERFACE, None)
236        };
237        // SAFETY: data has the interface WlShmPool::WL_INTERFACE
238        unsafe { proxy::low_level::from_untyped_owned(data) }
239    }
240}
241
242impl WlShm {
243    /// Since when the format event is available.
244    #[allow(dead_code)]
245    pub const EVT__FORMAT__SINCE: u32 = 1;
246}
247
248/// An event handler for [WlShm] proxies.
249#[allow(dead_code)]
250pub trait WlShmEventHandler {
251    type Data: 'static;
252
253    /// pixel format description
254    ///
255    /// Informs the client about a valid pixel format that
256    /// can be used for buffers. Known formats include
257    /// argb8888 and xrgb8888.
258    ///
259    /// # Arguments
260    ///
261    /// - `format`: buffer pixel format
262    #[inline]
263    fn format(&self, _data: &mut Self::Data, _slf: &WlShmRef, format: WlShmFormat) {
264        let _ = format;
265    }
266}
267
268impl WlShmEventHandler for private::NoOpEventHandler {
269    type Data = ();
270}
271
272// SAFETY: - INTERFACE is a valid wl_interface
273//         - mutable_type always returns the same value
274unsafe impl<H> EventHandler for private::EventHandler<H>
275where
276    H: WlShmEventHandler,
277{
278    const WL_INTERFACE: &'static wl_interface = &INTERFACE;
279
280    #[inline]
281    fn mutable_type() -> Option<(TypeId, &'static str)> {
282        let id = TypeId::of::<H::Data>();
283        let name = std::any::type_name::<H::Data>();
284        Some((id, name))
285    }
286
287    #[allow(unused_variables)]
288    unsafe fn handle_event(
289        &self,
290        queue: &Queue,
291        data: *mut u8,
292        slf: &UntypedBorrowedProxy,
293        opcode: u32,
294        args: *mut wl_argument,
295    ) {
296        // SAFETY: This function requires that slf has the interface INTERFACE
297        let slf = unsafe { proxy::low_level::from_untyped_borrowed::<WlShmRef>(slf) };
298        // SAFETY: This function requires that data is `&mut T` where `T`
299        //         has the type id returned by `Self::mutable_type`, i.e.,
300        //         `T = H::Data`.
301        let data: &mut H::Data = unsafe { &mut *data.cast() };
302        match opcode {
303            0 => {
304                // SAFETY: INTERFACE requires that there are 1 arguments
305                let args = unsafe { &*args.cast::<[wl_argument; 1]>() };
306                // SAFETY: - INTERFACE requires that args[0] contains a uint
307                let arg0 = unsafe { WlShmFormat(args[0].u) };
308                self.0.format(data, slf, arg0);
309            }
310            _ => {
311                invalid_opcode("wl_shm", opcode);
312            }
313        }
314    }
315}
316
317impl<H> CreateEventHandler<H> for private::ProxyApi
318where
319    H: WlShmEventHandler,
320{
321    type EventHandler = private::EventHandler<H>;
322
323    #[inline]
324    fn create_event_handler(handler: H) -> Self::EventHandler {
325        private::EventHandler(handler)
326    }
327}
328
329impl WlShm {
330    /// Since when the error.invalid_format enum variant is available.
331    #[allow(dead_code)]
332    pub const ENM__ERROR_INVALID_FORMAT__SINCE: u32 = 1;
333    /// Since when the error.invalid_stride enum variant is available.
334    #[allow(dead_code)]
335    pub const ENM__ERROR_INVALID_STRIDE__SINCE: u32 = 1;
336    /// Since when the error.invalid_fd enum variant is available.
337    #[allow(dead_code)]
338    pub const ENM__ERROR_INVALID_FD__SINCE: u32 = 1;
339
340    /// Since when the format.argb8888 enum variant is available.
341    #[allow(dead_code)]
342    pub const ENM__FORMAT_ARGB8888__SINCE: u32 = 1;
343    /// Since when the format.xrgb8888 enum variant is available.
344    #[allow(dead_code)]
345    pub const ENM__FORMAT_XRGB8888__SINCE: u32 = 1;
346    /// Since when the format.c8 enum variant is available.
347    #[allow(dead_code)]
348    pub const ENM__FORMAT_C8__SINCE: u32 = 1;
349    /// Since when the format.rgb332 enum variant is available.
350    #[allow(dead_code)]
351    pub const ENM__FORMAT_RGB332__SINCE: u32 = 1;
352    /// Since when the format.bgr233 enum variant is available.
353    #[allow(dead_code)]
354    pub const ENM__FORMAT_BGR233__SINCE: u32 = 1;
355    /// Since when the format.xrgb4444 enum variant is available.
356    #[allow(dead_code)]
357    pub const ENM__FORMAT_XRGB4444__SINCE: u32 = 1;
358    /// Since when the format.xbgr4444 enum variant is available.
359    #[allow(dead_code)]
360    pub const ENM__FORMAT_XBGR4444__SINCE: u32 = 1;
361    /// Since when the format.rgbx4444 enum variant is available.
362    #[allow(dead_code)]
363    pub const ENM__FORMAT_RGBX4444__SINCE: u32 = 1;
364    /// Since when the format.bgrx4444 enum variant is available.
365    #[allow(dead_code)]
366    pub const ENM__FORMAT_BGRX4444__SINCE: u32 = 1;
367    /// Since when the format.argb4444 enum variant is available.
368    #[allow(dead_code)]
369    pub const ENM__FORMAT_ARGB4444__SINCE: u32 = 1;
370    /// Since when the format.abgr4444 enum variant is available.
371    #[allow(dead_code)]
372    pub const ENM__FORMAT_ABGR4444__SINCE: u32 = 1;
373    /// Since when the format.rgba4444 enum variant is available.
374    #[allow(dead_code)]
375    pub const ENM__FORMAT_RGBA4444__SINCE: u32 = 1;
376    /// Since when the format.bgra4444 enum variant is available.
377    #[allow(dead_code)]
378    pub const ENM__FORMAT_BGRA4444__SINCE: u32 = 1;
379    /// Since when the format.xrgb1555 enum variant is available.
380    #[allow(dead_code)]
381    pub const ENM__FORMAT_XRGB1555__SINCE: u32 = 1;
382    /// Since when the format.xbgr1555 enum variant is available.
383    #[allow(dead_code)]
384    pub const ENM__FORMAT_XBGR1555__SINCE: u32 = 1;
385    /// Since when the format.rgbx5551 enum variant is available.
386    #[allow(dead_code)]
387    pub const ENM__FORMAT_RGBX5551__SINCE: u32 = 1;
388    /// Since when the format.bgrx5551 enum variant is available.
389    #[allow(dead_code)]
390    pub const ENM__FORMAT_BGRX5551__SINCE: u32 = 1;
391    /// Since when the format.argb1555 enum variant is available.
392    #[allow(dead_code)]
393    pub const ENM__FORMAT_ARGB1555__SINCE: u32 = 1;
394    /// Since when the format.abgr1555 enum variant is available.
395    #[allow(dead_code)]
396    pub const ENM__FORMAT_ABGR1555__SINCE: u32 = 1;
397    /// Since when the format.rgba5551 enum variant is available.
398    #[allow(dead_code)]
399    pub const ENM__FORMAT_RGBA5551__SINCE: u32 = 1;
400    /// Since when the format.bgra5551 enum variant is available.
401    #[allow(dead_code)]
402    pub const ENM__FORMAT_BGRA5551__SINCE: u32 = 1;
403    /// Since when the format.rgb565 enum variant is available.
404    #[allow(dead_code)]
405    pub const ENM__FORMAT_RGB565__SINCE: u32 = 1;
406    /// Since when the format.bgr565 enum variant is available.
407    #[allow(dead_code)]
408    pub const ENM__FORMAT_BGR565__SINCE: u32 = 1;
409    /// Since when the format.rgb888 enum variant is available.
410    #[allow(dead_code)]
411    pub const ENM__FORMAT_RGB888__SINCE: u32 = 1;
412    /// Since when the format.bgr888 enum variant is available.
413    #[allow(dead_code)]
414    pub const ENM__FORMAT_BGR888__SINCE: u32 = 1;
415    /// Since when the format.xbgr8888 enum variant is available.
416    #[allow(dead_code)]
417    pub const ENM__FORMAT_XBGR8888__SINCE: u32 = 1;
418    /// Since when the format.rgbx8888 enum variant is available.
419    #[allow(dead_code)]
420    pub const ENM__FORMAT_RGBX8888__SINCE: u32 = 1;
421    /// Since when the format.bgrx8888 enum variant is available.
422    #[allow(dead_code)]
423    pub const ENM__FORMAT_BGRX8888__SINCE: u32 = 1;
424    /// Since when the format.abgr8888 enum variant is available.
425    #[allow(dead_code)]
426    pub const ENM__FORMAT_ABGR8888__SINCE: u32 = 1;
427    /// Since when the format.rgba8888 enum variant is available.
428    #[allow(dead_code)]
429    pub const ENM__FORMAT_RGBA8888__SINCE: u32 = 1;
430    /// Since when the format.bgra8888 enum variant is available.
431    #[allow(dead_code)]
432    pub const ENM__FORMAT_BGRA8888__SINCE: u32 = 1;
433    /// Since when the format.xrgb2101010 enum variant is available.
434    #[allow(dead_code)]
435    pub const ENM__FORMAT_XRGB2101010__SINCE: u32 = 1;
436    /// Since when the format.xbgr2101010 enum variant is available.
437    #[allow(dead_code)]
438    pub const ENM__FORMAT_XBGR2101010__SINCE: u32 = 1;
439    /// Since when the format.rgbx1010102 enum variant is available.
440    #[allow(dead_code)]
441    pub const ENM__FORMAT_RGBX1010102__SINCE: u32 = 1;
442    /// Since when the format.bgrx1010102 enum variant is available.
443    #[allow(dead_code)]
444    pub const ENM__FORMAT_BGRX1010102__SINCE: u32 = 1;
445    /// Since when the format.argb2101010 enum variant is available.
446    #[allow(dead_code)]
447    pub const ENM__FORMAT_ARGB2101010__SINCE: u32 = 1;
448    /// Since when the format.abgr2101010 enum variant is available.
449    #[allow(dead_code)]
450    pub const ENM__FORMAT_ABGR2101010__SINCE: u32 = 1;
451    /// Since when the format.rgba1010102 enum variant is available.
452    #[allow(dead_code)]
453    pub const ENM__FORMAT_RGBA1010102__SINCE: u32 = 1;
454    /// Since when the format.bgra1010102 enum variant is available.
455    #[allow(dead_code)]
456    pub const ENM__FORMAT_BGRA1010102__SINCE: u32 = 1;
457    /// Since when the format.yuyv enum variant is available.
458    #[allow(dead_code)]
459    pub const ENM__FORMAT_YUYV__SINCE: u32 = 1;
460    /// Since when the format.yvyu enum variant is available.
461    #[allow(dead_code)]
462    pub const ENM__FORMAT_YVYU__SINCE: u32 = 1;
463    /// Since when the format.uyvy enum variant is available.
464    #[allow(dead_code)]
465    pub const ENM__FORMAT_UYVY__SINCE: u32 = 1;
466    /// Since when the format.vyuy enum variant is available.
467    #[allow(dead_code)]
468    pub const ENM__FORMAT_VYUY__SINCE: u32 = 1;
469    /// Since when the format.ayuv enum variant is available.
470    #[allow(dead_code)]
471    pub const ENM__FORMAT_AYUV__SINCE: u32 = 1;
472    /// Since when the format.nv12 enum variant is available.
473    #[allow(dead_code)]
474    pub const ENM__FORMAT_NV12__SINCE: u32 = 1;
475    /// Since when the format.nv21 enum variant is available.
476    #[allow(dead_code)]
477    pub const ENM__FORMAT_NV21__SINCE: u32 = 1;
478    /// Since when the format.nv16 enum variant is available.
479    #[allow(dead_code)]
480    pub const ENM__FORMAT_NV16__SINCE: u32 = 1;
481    /// Since when the format.nv61 enum variant is available.
482    #[allow(dead_code)]
483    pub const ENM__FORMAT_NV61__SINCE: u32 = 1;
484    /// Since when the format.yuv410 enum variant is available.
485    #[allow(dead_code)]
486    pub const ENM__FORMAT_YUV410__SINCE: u32 = 1;
487    /// Since when the format.yvu410 enum variant is available.
488    #[allow(dead_code)]
489    pub const ENM__FORMAT_YVU410__SINCE: u32 = 1;
490    /// Since when the format.yuv411 enum variant is available.
491    #[allow(dead_code)]
492    pub const ENM__FORMAT_YUV411__SINCE: u32 = 1;
493    /// Since when the format.yvu411 enum variant is available.
494    #[allow(dead_code)]
495    pub const ENM__FORMAT_YVU411__SINCE: u32 = 1;
496    /// Since when the format.yuv420 enum variant is available.
497    #[allow(dead_code)]
498    pub const ENM__FORMAT_YUV420__SINCE: u32 = 1;
499    /// Since when the format.yvu420 enum variant is available.
500    #[allow(dead_code)]
501    pub const ENM__FORMAT_YVU420__SINCE: u32 = 1;
502    /// Since when the format.yuv422 enum variant is available.
503    #[allow(dead_code)]
504    pub const ENM__FORMAT_YUV422__SINCE: u32 = 1;
505    /// Since when the format.yvu422 enum variant is available.
506    #[allow(dead_code)]
507    pub const ENM__FORMAT_YVU422__SINCE: u32 = 1;
508    /// Since when the format.yuv444 enum variant is available.
509    #[allow(dead_code)]
510    pub const ENM__FORMAT_YUV444__SINCE: u32 = 1;
511    /// Since when the format.yvu444 enum variant is available.
512    #[allow(dead_code)]
513    pub const ENM__FORMAT_YVU444__SINCE: u32 = 1;
514    /// Since when the format.r8 enum variant is available.
515    #[allow(dead_code)]
516    pub const ENM__FORMAT_R8__SINCE: u32 = 1;
517    /// Since when the format.r16 enum variant is available.
518    #[allow(dead_code)]
519    pub const ENM__FORMAT_R16__SINCE: u32 = 1;
520    /// Since when the format.rg88 enum variant is available.
521    #[allow(dead_code)]
522    pub const ENM__FORMAT_RG88__SINCE: u32 = 1;
523    /// Since when the format.gr88 enum variant is available.
524    #[allow(dead_code)]
525    pub const ENM__FORMAT_GR88__SINCE: u32 = 1;
526    /// Since when the format.rg1616 enum variant is available.
527    #[allow(dead_code)]
528    pub const ENM__FORMAT_RG1616__SINCE: u32 = 1;
529    /// Since when the format.gr1616 enum variant is available.
530    #[allow(dead_code)]
531    pub const ENM__FORMAT_GR1616__SINCE: u32 = 1;
532    /// Since when the format.xrgb16161616f enum variant is available.
533    #[allow(dead_code)]
534    pub const ENM__FORMAT_XRGB16161616F__SINCE: u32 = 1;
535    /// Since when the format.xbgr16161616f enum variant is available.
536    #[allow(dead_code)]
537    pub const ENM__FORMAT_XBGR16161616F__SINCE: u32 = 1;
538    /// Since when the format.argb16161616f enum variant is available.
539    #[allow(dead_code)]
540    pub const ENM__FORMAT_ARGB16161616F__SINCE: u32 = 1;
541    /// Since when the format.abgr16161616f enum variant is available.
542    #[allow(dead_code)]
543    pub const ENM__FORMAT_ABGR16161616F__SINCE: u32 = 1;
544    /// Since when the format.xyuv8888 enum variant is available.
545    #[allow(dead_code)]
546    pub const ENM__FORMAT_XYUV8888__SINCE: u32 = 1;
547    /// Since when the format.vuy888 enum variant is available.
548    #[allow(dead_code)]
549    pub const ENM__FORMAT_VUY888__SINCE: u32 = 1;
550    /// Since when the format.vuy101010 enum variant is available.
551    #[allow(dead_code)]
552    pub const ENM__FORMAT_VUY101010__SINCE: u32 = 1;
553    /// Since when the format.y210 enum variant is available.
554    #[allow(dead_code)]
555    pub const ENM__FORMAT_Y210__SINCE: u32 = 1;
556    /// Since when the format.y212 enum variant is available.
557    #[allow(dead_code)]
558    pub const ENM__FORMAT_Y212__SINCE: u32 = 1;
559    /// Since when the format.y216 enum variant is available.
560    #[allow(dead_code)]
561    pub const ENM__FORMAT_Y216__SINCE: u32 = 1;
562    /// Since when the format.y410 enum variant is available.
563    #[allow(dead_code)]
564    pub const ENM__FORMAT_Y410__SINCE: u32 = 1;
565    /// Since when the format.y412 enum variant is available.
566    #[allow(dead_code)]
567    pub const ENM__FORMAT_Y412__SINCE: u32 = 1;
568    /// Since when the format.y416 enum variant is available.
569    #[allow(dead_code)]
570    pub const ENM__FORMAT_Y416__SINCE: u32 = 1;
571    /// Since when the format.xvyu2101010 enum variant is available.
572    #[allow(dead_code)]
573    pub const ENM__FORMAT_XVYU2101010__SINCE: u32 = 1;
574    /// Since when the format.xvyu12_16161616 enum variant is available.
575    #[allow(dead_code)]
576    pub const ENM__FORMAT_XVYU12_16161616__SINCE: u32 = 1;
577    /// Since when the format.xvyu16161616 enum variant is available.
578    #[allow(dead_code)]
579    pub const ENM__FORMAT_XVYU16161616__SINCE: u32 = 1;
580    /// Since when the format.y0l0 enum variant is available.
581    #[allow(dead_code)]
582    pub const ENM__FORMAT_Y0L0__SINCE: u32 = 1;
583    /// Since when the format.x0l0 enum variant is available.
584    #[allow(dead_code)]
585    pub const ENM__FORMAT_X0L0__SINCE: u32 = 1;
586    /// Since when the format.y0l2 enum variant is available.
587    #[allow(dead_code)]
588    pub const ENM__FORMAT_Y0L2__SINCE: u32 = 1;
589    /// Since when the format.x0l2 enum variant is available.
590    #[allow(dead_code)]
591    pub const ENM__FORMAT_X0L2__SINCE: u32 = 1;
592    /// Since when the format.yuv420_8bit enum variant is available.
593    #[allow(dead_code)]
594    pub const ENM__FORMAT_YUV420_8BIT__SINCE: u32 = 1;
595    /// Since when the format.yuv420_10bit enum variant is available.
596    #[allow(dead_code)]
597    pub const ENM__FORMAT_YUV420_10BIT__SINCE: u32 = 1;
598    /// Since when the format.xrgb8888_a8 enum variant is available.
599    #[allow(dead_code)]
600    pub const ENM__FORMAT_XRGB8888_A8__SINCE: u32 = 1;
601    /// Since when the format.xbgr8888_a8 enum variant is available.
602    #[allow(dead_code)]
603    pub const ENM__FORMAT_XBGR8888_A8__SINCE: u32 = 1;
604    /// Since when the format.rgbx8888_a8 enum variant is available.
605    #[allow(dead_code)]
606    pub const ENM__FORMAT_RGBX8888_A8__SINCE: u32 = 1;
607    /// Since when the format.bgrx8888_a8 enum variant is available.
608    #[allow(dead_code)]
609    pub const ENM__FORMAT_BGRX8888_A8__SINCE: u32 = 1;
610    /// Since when the format.rgb888_a8 enum variant is available.
611    #[allow(dead_code)]
612    pub const ENM__FORMAT_RGB888_A8__SINCE: u32 = 1;
613    /// Since when the format.bgr888_a8 enum variant is available.
614    #[allow(dead_code)]
615    pub const ENM__FORMAT_BGR888_A8__SINCE: u32 = 1;
616    /// Since when the format.rgb565_a8 enum variant is available.
617    #[allow(dead_code)]
618    pub const ENM__FORMAT_RGB565_A8__SINCE: u32 = 1;
619    /// Since when the format.bgr565_a8 enum variant is available.
620    #[allow(dead_code)]
621    pub const ENM__FORMAT_BGR565_A8__SINCE: u32 = 1;
622    /// Since when the format.nv24 enum variant is available.
623    #[allow(dead_code)]
624    pub const ENM__FORMAT_NV24__SINCE: u32 = 1;
625    /// Since when the format.nv42 enum variant is available.
626    #[allow(dead_code)]
627    pub const ENM__FORMAT_NV42__SINCE: u32 = 1;
628    /// Since when the format.p210 enum variant is available.
629    #[allow(dead_code)]
630    pub const ENM__FORMAT_P210__SINCE: u32 = 1;
631    /// Since when the format.p010 enum variant is available.
632    #[allow(dead_code)]
633    pub const ENM__FORMAT_P010__SINCE: u32 = 1;
634    /// Since when the format.p012 enum variant is available.
635    #[allow(dead_code)]
636    pub const ENM__FORMAT_P012__SINCE: u32 = 1;
637    /// Since when the format.p016 enum variant is available.
638    #[allow(dead_code)]
639    pub const ENM__FORMAT_P016__SINCE: u32 = 1;
640    /// Since when the format.axbxgxrx106106106106 enum variant is available.
641    #[allow(dead_code)]
642    pub const ENM__FORMAT_AXBXGXRX106106106106__SINCE: u32 = 1;
643    /// Since when the format.nv15 enum variant is available.
644    #[allow(dead_code)]
645    pub const ENM__FORMAT_NV15__SINCE: u32 = 1;
646    /// Since when the format.q410 enum variant is available.
647    #[allow(dead_code)]
648    pub const ENM__FORMAT_Q410__SINCE: u32 = 1;
649    /// Since when the format.q401 enum variant is available.
650    #[allow(dead_code)]
651    pub const ENM__FORMAT_Q401__SINCE: u32 = 1;
652    /// Since when the format.xrgb16161616 enum variant is available.
653    #[allow(dead_code)]
654    pub const ENM__FORMAT_XRGB16161616__SINCE: u32 = 1;
655    /// Since when the format.xbgr16161616 enum variant is available.
656    #[allow(dead_code)]
657    pub const ENM__FORMAT_XBGR16161616__SINCE: u32 = 1;
658    /// Since when the format.argb16161616 enum variant is available.
659    #[allow(dead_code)]
660    pub const ENM__FORMAT_ARGB16161616__SINCE: u32 = 1;
661    /// Since when the format.abgr16161616 enum variant is available.
662    #[allow(dead_code)]
663    pub const ENM__FORMAT_ABGR16161616__SINCE: u32 = 1;
664    /// Since when the format.c1 enum variant is available.
665    #[allow(dead_code)]
666    pub const ENM__FORMAT_C1__SINCE: u32 = 1;
667    /// Since when the format.c2 enum variant is available.
668    #[allow(dead_code)]
669    pub const ENM__FORMAT_C2__SINCE: u32 = 1;
670    /// Since when the format.c4 enum variant is available.
671    #[allow(dead_code)]
672    pub const ENM__FORMAT_C4__SINCE: u32 = 1;
673    /// Since when the format.d1 enum variant is available.
674    #[allow(dead_code)]
675    pub const ENM__FORMAT_D1__SINCE: u32 = 1;
676    /// Since when the format.d2 enum variant is available.
677    #[allow(dead_code)]
678    pub const ENM__FORMAT_D2__SINCE: u32 = 1;
679    /// Since when the format.d4 enum variant is available.
680    #[allow(dead_code)]
681    pub const ENM__FORMAT_D4__SINCE: u32 = 1;
682    /// Since when the format.d8 enum variant is available.
683    #[allow(dead_code)]
684    pub const ENM__FORMAT_D8__SINCE: u32 = 1;
685    /// Since when the format.r1 enum variant is available.
686    #[allow(dead_code)]
687    pub const ENM__FORMAT_R1__SINCE: u32 = 1;
688    /// Since when the format.r2 enum variant is available.
689    #[allow(dead_code)]
690    pub const ENM__FORMAT_R2__SINCE: u32 = 1;
691    /// Since when the format.r4 enum variant is available.
692    #[allow(dead_code)]
693    pub const ENM__FORMAT_R4__SINCE: u32 = 1;
694    /// Since when the format.r10 enum variant is available.
695    #[allow(dead_code)]
696    pub const ENM__FORMAT_R10__SINCE: u32 = 1;
697    /// Since when the format.r12 enum variant is available.
698    #[allow(dead_code)]
699    pub const ENM__FORMAT_R12__SINCE: u32 = 1;
700    /// Since when the format.avuy8888 enum variant is available.
701    #[allow(dead_code)]
702    pub const ENM__FORMAT_AVUY8888__SINCE: u32 = 1;
703    /// Since when the format.xvuy8888 enum variant is available.
704    #[allow(dead_code)]
705    pub const ENM__FORMAT_XVUY8888__SINCE: u32 = 1;
706    /// Since when the format.p030 enum variant is available.
707    #[allow(dead_code)]
708    pub const ENM__FORMAT_P030__SINCE: u32 = 1;
709}
710
711/// wl_shm error values
712///
713/// These errors can be emitted in response to wl_shm requests.
714#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
715#[allow(dead_code)]
716pub struct WlShmError(pub u32);
717
718impl WlShmError {
719    /// buffer format is not known
720    #[allow(dead_code)]
721    pub const INVALID_FORMAT: Self = Self(0);
722
723    /// invalid size or stride during pool or buffer creation
724    #[allow(dead_code)]
725    pub const INVALID_STRIDE: Self = Self(1);
726
727    /// mmapping the file descriptor failed
728    #[allow(dead_code)]
729    pub const INVALID_FD: Self = Self(2);
730}
731
732impl Debug for WlShmError {
733    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
734        let name = match *self {
735            Self::INVALID_FORMAT => "INVALID_FORMAT",
736            Self::INVALID_STRIDE => "INVALID_STRIDE",
737            Self::INVALID_FD => "INVALID_FD",
738            _ => return Debug::fmt(&self.0, f),
739        };
740        f.write_str(name)
741    }
742}
743
744/// pixel formats
745///
746/// This describes the memory layout of an individual pixel.
747///
748/// All renderers should support argb8888 and xrgb8888 but any other
749/// formats are optional and may not be supported by the particular
750/// renderer in use.
751///
752/// The drm format codes match the macros defined in drm_fourcc.h, except
753/// argb8888 and xrgb8888. The formats actually supported by the compositor
754/// will be reported by the format event.
755///
756/// For all wl_shm formats and unless specified in another protocol
757/// extension, pre-multiplied alpha is used for pixel values.
758#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
759#[allow(dead_code)]
760pub struct WlShmFormat(pub u32);
761
762impl WlShmFormat {
763    /// 32-bit ARGB format, [31:0] A:R:G:B 8:8:8:8 little endian
764    #[allow(dead_code)]
765    pub const ARGB8888: Self = Self(0);
766
767    /// 32-bit RGB format, [31:0] x:R:G:B 8:8:8:8 little endian
768    #[allow(dead_code)]
769    pub const XRGB8888: Self = Self(1);
770
771    /// 8-bit color index format, [7:0] C
772    #[allow(dead_code)]
773    pub const C8: Self = Self(0x20203843);
774
775    /// 8-bit RGB format, [7:0] R:G:B 3:3:2
776    #[allow(dead_code)]
777    pub const RGB332: Self = Self(0x38424752);
778
779    /// 8-bit BGR format, [7:0] B:G:R 2:3:3
780    #[allow(dead_code)]
781    pub const BGR233: Self = Self(0x38524742);
782
783    /// 16-bit xRGB format, [15:0] x:R:G:B 4:4:4:4 little endian
784    #[allow(dead_code)]
785    pub const XRGB4444: Self = Self(0x32315258);
786
787    /// 16-bit xBGR format, [15:0] x:B:G:R 4:4:4:4 little endian
788    #[allow(dead_code)]
789    pub const XBGR4444: Self = Self(0x32314258);
790
791    /// 16-bit RGBx format, [15:0] R:G:B:x 4:4:4:4 little endian
792    #[allow(dead_code)]
793    pub const RGBX4444: Self = Self(0x32315852);
794
795    /// 16-bit BGRx format, [15:0] B:G:R:x 4:4:4:4 little endian
796    #[allow(dead_code)]
797    pub const BGRX4444: Self = Self(0x32315842);
798
799    /// 16-bit ARGB format, [15:0] A:R:G:B 4:4:4:4 little endian
800    #[allow(dead_code)]
801    pub const ARGB4444: Self = Self(0x32315241);
802
803    /// 16-bit ABGR format, [15:0] A:B:G:R 4:4:4:4 little endian
804    #[allow(dead_code)]
805    pub const ABGR4444: Self = Self(0x32314241);
806
807    /// 16-bit RBGA format, [15:0] R:G:B:A 4:4:4:4 little endian
808    #[allow(dead_code)]
809    pub const RGBA4444: Self = Self(0x32314152);
810
811    /// 16-bit BGRA format, [15:0] B:G:R:A 4:4:4:4 little endian
812    #[allow(dead_code)]
813    pub const BGRA4444: Self = Self(0x32314142);
814
815    /// 16-bit xRGB format, [15:0] x:R:G:B 1:5:5:5 little endian
816    #[allow(dead_code)]
817    pub const XRGB1555: Self = Self(0x35315258);
818
819    /// 16-bit xBGR 1555 format, [15:0] x:B:G:R 1:5:5:5 little endian
820    #[allow(dead_code)]
821    pub const XBGR1555: Self = Self(0x35314258);
822
823    /// 16-bit RGBx 5551 format, [15:0] R:G:B:x 5:5:5:1 little endian
824    #[allow(dead_code)]
825    pub const RGBX5551: Self = Self(0x35315852);
826
827    /// 16-bit BGRx 5551 format, [15:0] B:G:R:x 5:5:5:1 little endian
828    #[allow(dead_code)]
829    pub const BGRX5551: Self = Self(0x35315842);
830
831    /// 16-bit ARGB 1555 format, [15:0] A:R:G:B 1:5:5:5 little endian
832    #[allow(dead_code)]
833    pub const ARGB1555: Self = Self(0x35315241);
834
835    /// 16-bit ABGR 1555 format, [15:0] A:B:G:R 1:5:5:5 little endian
836    #[allow(dead_code)]
837    pub const ABGR1555: Self = Self(0x35314241);
838
839    /// 16-bit RGBA 5551 format, [15:0] R:G:B:A 5:5:5:1 little endian
840    #[allow(dead_code)]
841    pub const RGBA5551: Self = Self(0x35314152);
842
843    /// 16-bit BGRA 5551 format, [15:0] B:G:R:A 5:5:5:1 little endian
844    #[allow(dead_code)]
845    pub const BGRA5551: Self = Self(0x35314142);
846
847    /// 16-bit RGB 565 format, [15:0] R:G:B 5:6:5 little endian
848    #[allow(dead_code)]
849    pub const RGB565: Self = Self(0x36314752);
850
851    /// 16-bit BGR 565 format, [15:0] B:G:R 5:6:5 little endian
852    #[allow(dead_code)]
853    pub const BGR565: Self = Self(0x36314742);
854
855    /// 24-bit RGB format, [23:0] R:G:B little endian
856    #[allow(dead_code)]
857    pub const RGB888: Self = Self(0x34324752);
858
859    /// 24-bit BGR format, [23:0] B:G:R little endian
860    #[allow(dead_code)]
861    pub const BGR888: Self = Self(0x34324742);
862
863    /// 32-bit xBGR format, [31:0] x:B:G:R 8:8:8:8 little endian
864    #[allow(dead_code)]
865    pub const XBGR8888: Self = Self(0x34324258);
866
867    /// 32-bit RGBx format, [31:0] R:G:B:x 8:8:8:8 little endian
868    #[allow(dead_code)]
869    pub const RGBX8888: Self = Self(0x34325852);
870
871    /// 32-bit BGRx format, [31:0] B:G:R:x 8:8:8:8 little endian
872    #[allow(dead_code)]
873    pub const BGRX8888: Self = Self(0x34325842);
874
875    /// 32-bit ABGR format, [31:0] A:B:G:R 8:8:8:8 little endian
876    #[allow(dead_code)]
877    pub const ABGR8888: Self = Self(0x34324241);
878
879    /// 32-bit RGBA format, [31:0] R:G:B:A 8:8:8:8 little endian
880    #[allow(dead_code)]
881    pub const RGBA8888: Self = Self(0x34324152);
882
883    /// 32-bit BGRA format, [31:0] B:G:R:A 8:8:8:8 little endian
884    #[allow(dead_code)]
885    pub const BGRA8888: Self = Self(0x34324142);
886
887    /// 32-bit xRGB format, [31:0] x:R:G:B 2:10:10:10 little endian
888    #[allow(dead_code)]
889    pub const XRGB2101010: Self = Self(0x30335258);
890
891    /// 32-bit xBGR format, [31:0] x:B:G:R 2:10:10:10 little endian
892    #[allow(dead_code)]
893    pub const XBGR2101010: Self = Self(0x30334258);
894
895    /// 32-bit RGBx format, [31:0] R:G:B:x 10:10:10:2 little endian
896    #[allow(dead_code)]
897    pub const RGBX1010102: Self = Self(0x30335852);
898
899    /// 32-bit BGRx format, [31:0] B:G:R:x 10:10:10:2 little endian
900    #[allow(dead_code)]
901    pub const BGRX1010102: Self = Self(0x30335842);
902
903    /// 32-bit ARGB format, [31:0] A:R:G:B 2:10:10:10 little endian
904    #[allow(dead_code)]
905    pub const ARGB2101010: Self = Self(0x30335241);
906
907    /// 32-bit ABGR format, [31:0] A:B:G:R 2:10:10:10 little endian
908    #[allow(dead_code)]
909    pub const ABGR2101010: Self = Self(0x30334241);
910
911    /// 32-bit RGBA format, [31:0] R:G:B:A 10:10:10:2 little endian
912    #[allow(dead_code)]
913    pub const RGBA1010102: Self = Self(0x30334152);
914
915    /// 32-bit BGRA format, [31:0] B:G:R:A 10:10:10:2 little endian
916    #[allow(dead_code)]
917    pub const BGRA1010102: Self = Self(0x30334142);
918
919    /// packed YCbCr format, [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian
920    #[allow(dead_code)]
921    pub const YUYV: Self = Self(0x56595559);
922
923    /// packed YCbCr format, [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian
924    #[allow(dead_code)]
925    pub const YVYU: Self = Self(0x55595659);
926
927    /// packed YCbCr format, [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian
928    #[allow(dead_code)]
929    pub const UYVY: Self = Self(0x59565955);
930
931    /// packed YCbCr format, [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian
932    #[allow(dead_code)]
933    pub const VYUY: Self = Self(0x59555956);
934
935    /// packed AYCbCr format, [31:0] A:Y:Cb:Cr 8:8:8:8 little endian
936    #[allow(dead_code)]
937    pub const AYUV: Self = Self(0x56555941);
938
939    /// 2 plane YCbCr Cr:Cb format, 2x2 subsampled Cr:Cb plane
940    #[allow(dead_code)]
941    pub const NV12: Self = Self(0x3231564e);
942
943    /// 2 plane YCbCr Cb:Cr format, 2x2 subsampled Cb:Cr plane
944    #[allow(dead_code)]
945    pub const NV21: Self = Self(0x3132564e);
946
947    /// 2 plane YCbCr Cr:Cb format, 2x1 subsampled Cr:Cb plane
948    #[allow(dead_code)]
949    pub const NV16: Self = Self(0x3631564e);
950
951    /// 2 plane YCbCr Cb:Cr format, 2x1 subsampled Cb:Cr plane
952    #[allow(dead_code)]
953    pub const NV61: Self = Self(0x3136564e);
954
955    /// 3 plane YCbCr format, 4x4 subsampled Cb (1) and Cr (2) planes
956    #[allow(dead_code)]
957    pub const YUV410: Self = Self(0x39565559);
958
959    /// 3 plane YCbCr format, 4x4 subsampled Cr (1) and Cb (2) planes
960    #[allow(dead_code)]
961    pub const YVU410: Self = Self(0x39555659);
962
963    /// 3 plane YCbCr format, 4x1 subsampled Cb (1) and Cr (2) planes
964    #[allow(dead_code)]
965    pub const YUV411: Self = Self(0x31315559);
966
967    /// 3 plane YCbCr format, 4x1 subsampled Cr (1) and Cb (2) planes
968    #[allow(dead_code)]
969    pub const YVU411: Self = Self(0x31315659);
970
971    /// 3 plane YCbCr format, 2x2 subsampled Cb (1) and Cr (2) planes
972    #[allow(dead_code)]
973    pub const YUV420: Self = Self(0x32315559);
974
975    /// 3 plane YCbCr format, 2x2 subsampled Cr (1) and Cb (2) planes
976    #[allow(dead_code)]
977    pub const YVU420: Self = Self(0x32315659);
978
979    /// 3 plane YCbCr format, 2x1 subsampled Cb (1) and Cr (2) planes
980    #[allow(dead_code)]
981    pub const YUV422: Self = Self(0x36315559);
982
983    /// 3 plane YCbCr format, 2x1 subsampled Cr (1) and Cb (2) planes
984    #[allow(dead_code)]
985    pub const YVU422: Self = Self(0x36315659);
986
987    /// 3 plane YCbCr format, non-subsampled Cb (1) and Cr (2) planes
988    #[allow(dead_code)]
989    pub const YUV444: Self = Self(0x34325559);
990
991    /// 3 plane YCbCr format, non-subsampled Cr (1) and Cb (2) planes
992    #[allow(dead_code)]
993    pub const YVU444: Self = Self(0x34325659);
994
995    /// [7:0] R
996    #[allow(dead_code)]
997    pub const R8: Self = Self(0x20203852);
998
999    /// [15:0] R little endian
1000    #[allow(dead_code)]
1001    pub const R16: Self = Self(0x20363152);
1002
1003    /// [15:0] R:G 8:8 little endian
1004    #[allow(dead_code)]
1005    pub const RG88: Self = Self(0x38384752);
1006
1007    /// [15:0] G:R 8:8 little endian
1008    #[allow(dead_code)]
1009    pub const GR88: Self = Self(0x38385247);
1010
1011    /// [31:0] R:G 16:16 little endian
1012    #[allow(dead_code)]
1013    pub const RG1616: Self = Self(0x32334752);
1014
1015    /// [31:0] G:R 16:16 little endian
1016    #[allow(dead_code)]
1017    pub const GR1616: Self = Self(0x32335247);
1018
1019    /// [63:0] x:R:G:B 16:16:16:16 little endian
1020    #[allow(dead_code)]
1021    pub const XRGB16161616F: Self = Self(0x48345258);
1022
1023    /// [63:0] x:B:G:R 16:16:16:16 little endian
1024    #[allow(dead_code)]
1025    pub const XBGR16161616F: Self = Self(0x48344258);
1026
1027    /// [63:0] A:R:G:B 16:16:16:16 little endian
1028    #[allow(dead_code)]
1029    pub const ARGB16161616F: Self = Self(0x48345241);
1030
1031    /// [63:0] A:B:G:R 16:16:16:16 little endian
1032    #[allow(dead_code)]
1033    pub const ABGR16161616F: Self = Self(0x48344241);
1034
1035    /// [31:0] X:Y:Cb:Cr 8:8:8:8 little endian
1036    #[allow(dead_code)]
1037    pub const XYUV8888: Self = Self(0x56555958);
1038
1039    /// [23:0] Cr:Cb:Y 8:8:8 little endian
1040    #[allow(dead_code)]
1041    pub const VUY888: Self = Self(0x34325556);
1042
1043    /// Y followed by U then V, 10:10:10. Non-linear modifier only
1044    #[allow(dead_code)]
1045    pub const VUY101010: Self = Self(0x30335556);
1046
1047    /// [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 10:6:10:6:10:6:10:6 little endian per 2 Y pixels
1048    #[allow(dead_code)]
1049    pub const Y210: Self = Self(0x30313259);
1050
1051    /// [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 12:4:12:4:12:4:12:4 little endian per 2 Y pixels
1052    #[allow(dead_code)]
1053    pub const Y212: Self = Self(0x32313259);
1054
1055    /// [63:0] Cr0:Y1:Cb0:Y0 16:16:16:16 little endian per 2 Y pixels
1056    #[allow(dead_code)]
1057    pub const Y216: Self = Self(0x36313259);
1058
1059    /// [31:0] A:Cr:Y:Cb 2:10:10:10 little endian
1060    #[allow(dead_code)]
1061    pub const Y410: Self = Self(0x30313459);
1062
1063    /// [63:0] A:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian
1064    #[allow(dead_code)]
1065    pub const Y412: Self = Self(0x32313459);
1066
1067    /// [63:0] A:Cr:Y:Cb 16:16:16:16 little endian
1068    #[allow(dead_code)]
1069    pub const Y416: Self = Self(0x36313459);
1070
1071    /// [31:0] X:Cr:Y:Cb 2:10:10:10 little endian
1072    #[allow(dead_code)]
1073    pub const XVYU2101010: Self = Self(0x30335658);
1074
1075    /// [63:0] X:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian
1076    #[allow(dead_code)]
1077    pub const XVYU12_16161616: Self = Self(0x36335658);
1078
1079    /// [63:0] X:Cr:Y:Cb 16:16:16:16 little endian
1080    #[allow(dead_code)]
1081    pub const XVYU16161616: Self = Self(0x38345658);
1082
1083    /// [63:0]   A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0  1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian
1084    #[allow(dead_code)]
1085    pub const Y0L0: Self = Self(0x304c3059);
1086
1087    /// [63:0]   X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0  1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian
1088    #[allow(dead_code)]
1089    pub const X0L0: Self = Self(0x304c3058);
1090
1091    /// [63:0]   A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0  1:1:10:10:10:1:1:10:10:10 little endian
1092    #[allow(dead_code)]
1093    pub const Y0L2: Self = Self(0x324c3059);
1094
1095    /// [63:0]   X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0  1:1:10:10:10:1:1:10:10:10 little endian
1096    #[allow(dead_code)]
1097    pub const X0L2: Self = Self(0x324c3058);
1098
1099    #[allow(dead_code)]
1100    pub const YUV420_8BIT: Self = Self(0x38305559);
1101
1102    #[allow(dead_code)]
1103    pub const YUV420_10BIT: Self = Self(0x30315559);
1104
1105    #[allow(dead_code)]
1106    pub const XRGB8888_A8: Self = Self(0x38415258);
1107
1108    #[allow(dead_code)]
1109    pub const XBGR8888_A8: Self = Self(0x38414258);
1110
1111    #[allow(dead_code)]
1112    pub const RGBX8888_A8: Self = Self(0x38415852);
1113
1114    #[allow(dead_code)]
1115    pub const BGRX8888_A8: Self = Self(0x38415842);
1116
1117    #[allow(dead_code)]
1118    pub const RGB888_A8: Self = Self(0x38413852);
1119
1120    #[allow(dead_code)]
1121    pub const BGR888_A8: Self = Self(0x38413842);
1122
1123    #[allow(dead_code)]
1124    pub const RGB565_A8: Self = Self(0x38413552);
1125
1126    #[allow(dead_code)]
1127    pub const BGR565_A8: Self = Self(0x38413542);
1128
1129    /// non-subsampled Cr:Cb plane
1130    #[allow(dead_code)]
1131    pub const NV24: Self = Self(0x3432564e);
1132
1133    /// non-subsampled Cb:Cr plane
1134    #[allow(dead_code)]
1135    pub const NV42: Self = Self(0x3234564e);
1136
1137    /// 2x1 subsampled Cr:Cb plane, 10 bit per channel
1138    #[allow(dead_code)]
1139    pub const P210: Self = Self(0x30313250);
1140
1141    /// 2x2 subsampled Cr:Cb plane 10 bits per channel
1142    #[allow(dead_code)]
1143    pub const P010: Self = Self(0x30313050);
1144
1145    /// 2x2 subsampled Cr:Cb plane 12 bits per channel
1146    #[allow(dead_code)]
1147    pub const P012: Self = Self(0x32313050);
1148
1149    /// 2x2 subsampled Cr:Cb plane 16 bits per channel
1150    #[allow(dead_code)]
1151    pub const P016: Self = Self(0x36313050);
1152
1153    /// [63:0] A:x:B:x:G:x:R:x 10:6:10:6:10:6:10:6 little endian
1154    #[allow(dead_code)]
1155    pub const AXBXGXRX106106106106: Self = Self(0x30314241);
1156
1157    /// 2x2 subsampled Cr:Cb plane
1158    #[allow(dead_code)]
1159    pub const NV15: Self = Self(0x3531564e);
1160
1161    #[allow(dead_code)]
1162    pub const Q410: Self = Self(0x30313451);
1163
1164    #[allow(dead_code)]
1165    pub const Q401: Self = Self(0x31303451);
1166
1167    /// [63:0] x:R:G:B 16:16:16:16 little endian
1168    #[allow(dead_code)]
1169    pub const XRGB16161616: Self = Self(0x38345258);
1170
1171    /// [63:0] x:B:G:R 16:16:16:16 little endian
1172    #[allow(dead_code)]
1173    pub const XBGR16161616: Self = Self(0x38344258);
1174
1175    /// [63:0] A:R:G:B 16:16:16:16 little endian
1176    #[allow(dead_code)]
1177    pub const ARGB16161616: Self = Self(0x38345241);
1178
1179    /// [63:0] A:B:G:R 16:16:16:16 little endian
1180    #[allow(dead_code)]
1181    pub const ABGR16161616: Self = Self(0x38344241);
1182
1183    /// [7:0] C0:C1:C2:C3:C4:C5:C6:C7 1:1:1:1:1:1:1:1 eight pixels/byte
1184    #[allow(dead_code)]
1185    pub const C1: Self = Self(0x20203143);
1186
1187    /// [7:0] C0:C1:C2:C3 2:2:2:2 four pixels/byte
1188    #[allow(dead_code)]
1189    pub const C2: Self = Self(0x20203243);
1190
1191    /// [7:0] C0:C1 4:4 two pixels/byte
1192    #[allow(dead_code)]
1193    pub const C4: Self = Self(0x20203443);
1194
1195    /// [7:0] D0:D1:D2:D3:D4:D5:D6:D7 1:1:1:1:1:1:1:1 eight pixels/byte
1196    #[allow(dead_code)]
1197    pub const D1: Self = Self(0x20203144);
1198
1199    /// [7:0] D0:D1:D2:D3 2:2:2:2 four pixels/byte
1200    #[allow(dead_code)]
1201    pub const D2: Self = Self(0x20203244);
1202
1203    /// [7:0] D0:D1 4:4 two pixels/byte
1204    #[allow(dead_code)]
1205    pub const D4: Self = Self(0x20203444);
1206
1207    /// [7:0] D
1208    #[allow(dead_code)]
1209    pub const D8: Self = Self(0x20203844);
1210
1211    /// [7:0] R0:R1:R2:R3:R4:R5:R6:R7 1:1:1:1:1:1:1:1 eight pixels/byte
1212    #[allow(dead_code)]
1213    pub const R1: Self = Self(0x20203152);
1214
1215    /// [7:0] R0:R1:R2:R3 2:2:2:2 four pixels/byte
1216    #[allow(dead_code)]
1217    pub const R2: Self = Self(0x20203252);
1218
1219    /// [7:0] R0:R1 4:4 two pixels/byte
1220    #[allow(dead_code)]
1221    pub const R4: Self = Self(0x20203452);
1222
1223    /// [15:0] x:R 6:10 little endian
1224    #[allow(dead_code)]
1225    pub const R10: Self = Self(0x20303152);
1226
1227    /// [15:0] x:R 4:12 little endian
1228    #[allow(dead_code)]
1229    pub const R12: Self = Self(0x20323152);
1230
1231    /// [31:0] A:Cr:Cb:Y 8:8:8:8 little endian
1232    #[allow(dead_code)]
1233    pub const AVUY8888: Self = Self(0x59555641);
1234
1235    /// [31:0] X:Cr:Cb:Y 8:8:8:8 little endian
1236    #[allow(dead_code)]
1237    pub const XVUY8888: Self = Self(0x59555658);
1238
1239    /// 2x2 subsampled Cr:Cb plane 10 bits per channel packed
1240    #[allow(dead_code)]
1241    pub const P030: Self = Self(0x30333050);
1242}
1243
1244impl Debug for WlShmFormat {
1245    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1246        let name = match *self {
1247            Self::ARGB8888 => "ARGB8888",
1248            Self::XRGB8888 => "XRGB8888",
1249            Self::C8 => "C8",
1250            Self::RGB332 => "RGB332",
1251            Self::BGR233 => "BGR233",
1252            Self::XRGB4444 => "XRGB4444",
1253            Self::XBGR4444 => "XBGR4444",
1254            Self::RGBX4444 => "RGBX4444",
1255            Self::BGRX4444 => "BGRX4444",
1256            Self::ARGB4444 => "ARGB4444",
1257            Self::ABGR4444 => "ABGR4444",
1258            Self::RGBA4444 => "RGBA4444",
1259            Self::BGRA4444 => "BGRA4444",
1260            Self::XRGB1555 => "XRGB1555",
1261            Self::XBGR1555 => "XBGR1555",
1262            Self::RGBX5551 => "RGBX5551",
1263            Self::BGRX5551 => "BGRX5551",
1264            Self::ARGB1555 => "ARGB1555",
1265            Self::ABGR1555 => "ABGR1555",
1266            Self::RGBA5551 => "RGBA5551",
1267            Self::BGRA5551 => "BGRA5551",
1268            Self::RGB565 => "RGB565",
1269            Self::BGR565 => "BGR565",
1270            Self::RGB888 => "RGB888",
1271            Self::BGR888 => "BGR888",
1272            Self::XBGR8888 => "XBGR8888",
1273            Self::RGBX8888 => "RGBX8888",
1274            Self::BGRX8888 => "BGRX8888",
1275            Self::ABGR8888 => "ABGR8888",
1276            Self::RGBA8888 => "RGBA8888",
1277            Self::BGRA8888 => "BGRA8888",
1278            Self::XRGB2101010 => "XRGB2101010",
1279            Self::XBGR2101010 => "XBGR2101010",
1280            Self::RGBX1010102 => "RGBX1010102",
1281            Self::BGRX1010102 => "BGRX1010102",
1282            Self::ARGB2101010 => "ARGB2101010",
1283            Self::ABGR2101010 => "ABGR2101010",
1284            Self::RGBA1010102 => "RGBA1010102",
1285            Self::BGRA1010102 => "BGRA1010102",
1286            Self::YUYV => "YUYV",
1287            Self::YVYU => "YVYU",
1288            Self::UYVY => "UYVY",
1289            Self::VYUY => "VYUY",
1290            Self::AYUV => "AYUV",
1291            Self::NV12 => "NV12",
1292            Self::NV21 => "NV21",
1293            Self::NV16 => "NV16",
1294            Self::NV61 => "NV61",
1295            Self::YUV410 => "YUV410",
1296            Self::YVU410 => "YVU410",
1297            Self::YUV411 => "YUV411",
1298            Self::YVU411 => "YVU411",
1299            Self::YUV420 => "YUV420",
1300            Self::YVU420 => "YVU420",
1301            Self::YUV422 => "YUV422",
1302            Self::YVU422 => "YVU422",
1303            Self::YUV444 => "YUV444",
1304            Self::YVU444 => "YVU444",
1305            Self::R8 => "R8",
1306            Self::R16 => "R16",
1307            Self::RG88 => "RG88",
1308            Self::GR88 => "GR88",
1309            Self::RG1616 => "RG1616",
1310            Self::GR1616 => "GR1616",
1311            Self::XRGB16161616F => "XRGB16161616F",
1312            Self::XBGR16161616F => "XBGR16161616F",
1313            Self::ARGB16161616F => "ARGB16161616F",
1314            Self::ABGR16161616F => "ABGR16161616F",
1315            Self::XYUV8888 => "XYUV8888",
1316            Self::VUY888 => "VUY888",
1317            Self::VUY101010 => "VUY101010",
1318            Self::Y210 => "Y210",
1319            Self::Y212 => "Y212",
1320            Self::Y216 => "Y216",
1321            Self::Y410 => "Y410",
1322            Self::Y412 => "Y412",
1323            Self::Y416 => "Y416",
1324            Self::XVYU2101010 => "XVYU2101010",
1325            Self::XVYU12_16161616 => "XVYU12_16161616",
1326            Self::XVYU16161616 => "XVYU16161616",
1327            Self::Y0L0 => "Y0L0",
1328            Self::X0L0 => "X0L0",
1329            Self::Y0L2 => "Y0L2",
1330            Self::X0L2 => "X0L2",
1331            Self::YUV420_8BIT => "YUV420_8BIT",
1332            Self::YUV420_10BIT => "YUV420_10BIT",
1333            Self::XRGB8888_A8 => "XRGB8888_A8",
1334            Self::XBGR8888_A8 => "XBGR8888_A8",
1335            Self::RGBX8888_A8 => "RGBX8888_A8",
1336            Self::BGRX8888_A8 => "BGRX8888_A8",
1337            Self::RGB888_A8 => "RGB888_A8",
1338            Self::BGR888_A8 => "BGR888_A8",
1339            Self::RGB565_A8 => "RGB565_A8",
1340            Self::BGR565_A8 => "BGR565_A8",
1341            Self::NV24 => "NV24",
1342            Self::NV42 => "NV42",
1343            Self::P210 => "P210",
1344            Self::P010 => "P010",
1345            Self::P012 => "P012",
1346            Self::P016 => "P016",
1347            Self::AXBXGXRX106106106106 => "AXBXGXRX106106106106",
1348            Self::NV15 => "NV15",
1349            Self::Q410 => "Q410",
1350            Self::Q401 => "Q401",
1351            Self::XRGB16161616 => "XRGB16161616",
1352            Self::XBGR16161616 => "XBGR16161616",
1353            Self::ARGB16161616 => "ARGB16161616",
1354            Self::ABGR16161616 => "ABGR16161616",
1355            Self::C1 => "C1",
1356            Self::C2 => "C2",
1357            Self::C4 => "C4",
1358            Self::D1 => "D1",
1359            Self::D2 => "D2",
1360            Self::D4 => "D4",
1361            Self::D8 => "D8",
1362            Self::R1 => "R1",
1363            Self::R2 => "R2",
1364            Self::R4 => "R4",
1365            Self::R10 => "R10",
1366            Self::R12 => "R12",
1367            Self::AVUY8888 => "AVUY8888",
1368            Self::XVUY8888 => "XVUY8888",
1369            Self::P030 => "P030",
1370            _ => return Debug::fmt(&self.0, f),
1371        };
1372        f.write_str(name)
1373    }
1374}
1375
1376/// Functional event handlers.
1377pub mod event_handlers {
1378    use super::*;
1379
1380    /// Event handler for format events.
1381    pub struct Format<T, F>(F, PhantomData<fn(&mut T)>);
1382    impl<T, F> WlShmEventHandler for Format<T, F>
1383    where
1384        T: 'static,
1385        F: Fn(&mut T, &WlShmRef, WlShmFormat),
1386    {
1387        type Data = T;
1388
1389        #[inline]
1390        fn format(&self, _data: &mut T, _slf: &WlShmRef, format: WlShmFormat) {
1391            self.0(_data, _slf, format)
1392        }
1393    }
1394
1395    impl WlShm {
1396        /// Creates an event handler for format events.
1397        ///
1398        /// The event handler ignores all other events.
1399        #[allow(dead_code)]
1400        pub fn on_format<T, F>(f: F) -> Format<T, F>
1401        where
1402            T: 'static,
1403            F: Fn(&mut T, &WlShmRef, WlShmFormat),
1404        {
1405            Format(f, PhantomData)
1406        }
1407    }
1408}