fidl_fuchsia_ui_display_singleton__common/
fidl_fuchsia_ui_display_singleton__common.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11/// The power mode of the display hardware.
12#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13pub enum PowerMode {
14    /// The display is powered off. The hardware will not apply new display
15    /// configs nor generate new VSync events.
16    ///
17    /// All display devices must support this power mode.
18    Off,
19    /// The display is fully powered on.
20    ///
21    /// All display devices must support this power mode.
22    On,
23    /// The display is powered on and configured in a low power state that
24    /// is suitable for presenting ambient information to the user,
25    /// possibly with lower fidelity than ON, but with greater efficiency.
26    ///
27    /// A display device must support both `DOZE` and `DOZE_SUSPEND` power
28    /// modes, or neither.
29    Doze,
30    /// The display is configured as the same state in DOZE but may stop
31    /// applying display updates from the client.
32    ///
33    /// This is effectively a hint to the device that drawing to the display
34    /// has been suspended and that the device must remain in a low power state
35    /// and continue displaying its current contents indefinitely until the
36    /// power mode changes.
37    ///
38    /// A display device must support both `DOZE` and `DOZE_SUSPEND` power
39    /// modes, or neither. When both modes are supported, the display device
40    /// is allowed to not use the hint above, in which case `DOZE_SUSPEND`
41    /// is identical to `DOZE`.
42    DozeSuspend,
43    #[doc(hidden)]
44    __SourceBreaking { unknown_ordinal: u32 },
45}
46
47/// Pattern that matches an unknown `PowerMode` member.
48#[macro_export]
49macro_rules! PowerModeUnknown {
50    () => {
51        _
52    };
53}
54
55impl PowerMode {
56    #[inline]
57    pub fn from_primitive(prim: u32) -> Option<Self> {
58        match prim {
59            0 => Some(Self::Off),
60            1 => Some(Self::On),
61            2 => Some(Self::Doze),
62            3 => Some(Self::DozeSuspend),
63            _ => None,
64        }
65    }
66
67    #[inline]
68    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
69        match prim {
70            0 => Self::Off,
71            1 => Self::On,
72            2 => Self::Doze,
73            3 => Self::DozeSuspend,
74            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
75        }
76    }
77
78    #[inline]
79    pub fn unknown() -> Self {
80        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
81    }
82
83    #[inline]
84    pub const fn into_primitive(self) -> u32 {
85        match self {
86            Self::Off => 0,
87            Self::On => 1,
88            Self::Doze => 2,
89            Self::DozeSuspend => 3,
90            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
91        }
92    }
93
94    #[inline]
95    pub fn is_unknown(&self) -> bool {
96        match self {
97            Self::__SourceBreaking { unknown_ordinal: _ } => true,
98            _ => false,
99        }
100    }
101}
102
103#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
104pub struct DisplayPowerSetPowerModeRequest {
105    /// The display's new power mode.
106    ///
107    /// Displays have `ON` power mode when they are connected to the system.
108    pub power_mode: PowerMode,
109}
110
111impl fidl::Persistable for DisplayPowerSetPowerModeRequest {}
112
113#[derive(Clone, Debug, PartialEq)]
114pub struct InfoGetMetricsResponse {
115    pub info: Metrics,
116}
117
118impl fidl::Persistable for InfoGetMetricsResponse {}
119
120#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
121#[repr(C)]
122pub struct VsyncSourceOnVsyncRequest {
123    /// The time when the VSync occurred.
124    ///
125    /// The accuracy of this timestamp depends on the display hardware.
126    pub timestamp: i64,
127}
128
129impl fidl::Persistable for VsyncSourceOnVsyncRequest {}
130
131#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
132pub struct VsyncSourceSetVsyncEnabledRequest {
133    pub enabled: bool,
134}
135
136impl fidl::Persistable for VsyncSourceSetVsyncEnabledRequest {}
137
138/// Describes the physical display, and how to map between physical and logical pixels.
139#[derive(Clone, Debug, Default, PartialEq)]
140pub struct Metrics {
141    /// Same meaning as `horizontal_resolution` and `vertical_resolution`
142    /// in `fuchsia.hardware.display.Mode`. Given in physical pixels.
143    pub extent_in_px: Option<fidl_fuchsia_math__common::SizeU>,
144    /// Same meaning as `horizontal_size_mm` and `vertical_size_mm`
145    /// in `fuchsia.hardware.display.Info`.
146    pub extent_in_mm: Option<fidl_fuchsia_math__common::SizeU>,
147    /// The number of physical pixels per "logical" pixel, for example as in
148    /// `fuchsia.ui.composition.LayoutInfo.logical_size`.  It provides an indication
149    /// of the size of image buffers that should be allocated.  This value would typically
150    /// be used by a component near the root of the scene graph to set a scale for the rest
151    /// of the scene beneath.
152    pub recommended_device_pixel_ratio: Option<fidl_fuchsia_math__common::VecF>,
153    /// The maximum mumber of images transmitted to the display in 1000 seconds.
154    /// This is the display's maximum vertical refresh rate, in millihertz (0.001 Hz).
155    pub maximum_refresh_rate_in_millihertz: Option<u32>,
156    #[doc(hidden)]
157    pub __source_breaking: fidl::marker::SourceBreaking,
158}
159
160impl fidl::Persistable for Metrics {}
161
162pub mod display_power_ordinals {
163    pub const SET_POWER_MODE: u64 = 0x420dcd07d68e1fbc;
164}
165
166pub mod info_ordinals {
167    pub const GET_METRICS: u64 = 0x6d631353834698be;
168}
169
170pub mod vsync_source_ordinals {
171    pub const SET_VSYNC_ENABLED: u64 = 0x5aaab140804e1b32;
172    pub const ON_VSYNC: u64 = 0x6677c178c3451448;
173}
174
175mod internal {
176    use super::*;
177    unsafe impl fidl::encoding::TypeMarker for PowerMode {
178        type Owned = Self;
179
180        #[inline(always)]
181        fn inline_align(_context: fidl::encoding::Context) -> usize {
182            std::mem::align_of::<u32>()
183        }
184
185        #[inline(always)]
186        fn inline_size(_context: fidl::encoding::Context) -> usize {
187            std::mem::size_of::<u32>()
188        }
189
190        #[inline(always)]
191        fn encode_is_copy() -> bool {
192            false
193        }
194
195        #[inline(always)]
196        fn decode_is_copy() -> bool {
197            false
198        }
199    }
200
201    impl fidl::encoding::ValueTypeMarker for PowerMode {
202        type Borrowed<'a> = Self;
203        #[inline(always)]
204        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
205            *value
206        }
207    }
208
209    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for PowerMode {
210        #[inline]
211        unsafe fn encode(
212            self,
213            encoder: &mut fidl::encoding::Encoder<'_, D>,
214            offset: usize,
215            _depth: fidl::encoding::Depth,
216        ) -> fidl::Result<()> {
217            encoder.debug_check_bounds::<Self>(offset);
218            encoder.write_num(self.into_primitive(), offset);
219            Ok(())
220        }
221    }
222
223    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PowerMode {
224        #[inline(always)]
225        fn new_empty() -> Self {
226            Self::unknown()
227        }
228
229        #[inline]
230        unsafe fn decode(
231            &mut self,
232            decoder: &mut fidl::encoding::Decoder<'_, D>,
233            offset: usize,
234            _depth: fidl::encoding::Depth,
235        ) -> fidl::Result<()> {
236            decoder.debug_check_bounds::<Self>(offset);
237            let prim = decoder.read_num::<u32>(offset);
238
239            *self = Self::from_primitive_allow_unknown(prim);
240            Ok(())
241        }
242    }
243
244    impl fidl::encoding::ValueTypeMarker for DisplayPowerSetPowerModeRequest {
245        type Borrowed<'a> = &'a Self;
246        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
247            value
248        }
249    }
250
251    unsafe impl fidl::encoding::TypeMarker for DisplayPowerSetPowerModeRequest {
252        type Owned = Self;
253
254        #[inline(always)]
255        fn inline_align(_context: fidl::encoding::Context) -> usize {
256            4
257        }
258
259        #[inline(always)]
260        fn inline_size(_context: fidl::encoding::Context) -> usize {
261            4
262        }
263    }
264
265    unsafe impl<D: fidl::encoding::ResourceDialect>
266        fidl::encoding::Encode<DisplayPowerSetPowerModeRequest, D>
267        for &DisplayPowerSetPowerModeRequest
268    {
269        #[inline]
270        unsafe fn encode(
271            self,
272            encoder: &mut fidl::encoding::Encoder<'_, D>,
273            offset: usize,
274            _depth: fidl::encoding::Depth,
275        ) -> fidl::Result<()> {
276            encoder.debug_check_bounds::<DisplayPowerSetPowerModeRequest>(offset);
277            // Delegate to tuple encoding.
278            fidl::encoding::Encode::<DisplayPowerSetPowerModeRequest, D>::encode(
279                (<PowerMode as fidl::encoding::ValueTypeMarker>::borrow(&self.power_mode),),
280                encoder,
281                offset,
282                _depth,
283            )
284        }
285    }
286    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PowerMode, D>>
287        fidl::encoding::Encode<DisplayPowerSetPowerModeRequest, D> for (T0,)
288    {
289        #[inline]
290        unsafe fn encode(
291            self,
292            encoder: &mut fidl::encoding::Encoder<'_, D>,
293            offset: usize,
294            depth: fidl::encoding::Depth,
295        ) -> fidl::Result<()> {
296            encoder.debug_check_bounds::<DisplayPowerSetPowerModeRequest>(offset);
297            // Zero out padding regions. There's no need to apply masks
298            // because the unmasked parts will be overwritten by fields.
299            // Write the fields.
300            self.0.encode(encoder, offset + 0, depth)?;
301            Ok(())
302        }
303    }
304
305    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
306        for DisplayPowerSetPowerModeRequest
307    {
308        #[inline(always)]
309        fn new_empty() -> Self {
310            Self { power_mode: fidl::new_empty!(PowerMode, D) }
311        }
312
313        #[inline]
314        unsafe fn decode(
315            &mut self,
316            decoder: &mut fidl::encoding::Decoder<'_, D>,
317            offset: usize,
318            _depth: fidl::encoding::Depth,
319        ) -> fidl::Result<()> {
320            decoder.debug_check_bounds::<Self>(offset);
321            // Verify that padding bytes are zero.
322            fidl::decode!(PowerMode, D, &mut self.power_mode, decoder, offset + 0, _depth)?;
323            Ok(())
324        }
325    }
326
327    impl fidl::encoding::ValueTypeMarker for InfoGetMetricsResponse {
328        type Borrowed<'a> = &'a Self;
329        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
330            value
331        }
332    }
333
334    unsafe impl fidl::encoding::TypeMarker for InfoGetMetricsResponse {
335        type Owned = Self;
336
337        #[inline(always)]
338        fn inline_align(_context: fidl::encoding::Context) -> usize {
339            8
340        }
341
342        #[inline(always)]
343        fn inline_size(_context: fidl::encoding::Context) -> usize {
344            16
345        }
346    }
347
348    unsafe impl<D: fidl::encoding::ResourceDialect>
349        fidl::encoding::Encode<InfoGetMetricsResponse, D> for &InfoGetMetricsResponse
350    {
351        #[inline]
352        unsafe fn encode(
353            self,
354            encoder: &mut fidl::encoding::Encoder<'_, D>,
355            offset: usize,
356            _depth: fidl::encoding::Depth,
357        ) -> fidl::Result<()> {
358            encoder.debug_check_bounds::<InfoGetMetricsResponse>(offset);
359            // Delegate to tuple encoding.
360            fidl::encoding::Encode::<InfoGetMetricsResponse, D>::encode(
361                (<Metrics as fidl::encoding::ValueTypeMarker>::borrow(&self.info),),
362                encoder,
363                offset,
364                _depth,
365            )
366        }
367    }
368    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Metrics, D>>
369        fidl::encoding::Encode<InfoGetMetricsResponse, D> for (T0,)
370    {
371        #[inline]
372        unsafe fn encode(
373            self,
374            encoder: &mut fidl::encoding::Encoder<'_, D>,
375            offset: usize,
376            depth: fidl::encoding::Depth,
377        ) -> fidl::Result<()> {
378            encoder.debug_check_bounds::<InfoGetMetricsResponse>(offset);
379            // Zero out padding regions. There's no need to apply masks
380            // because the unmasked parts will be overwritten by fields.
381            // Write the fields.
382            self.0.encode(encoder, offset + 0, depth)?;
383            Ok(())
384        }
385    }
386
387    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
388        for InfoGetMetricsResponse
389    {
390        #[inline(always)]
391        fn new_empty() -> Self {
392            Self { info: fidl::new_empty!(Metrics, D) }
393        }
394
395        #[inline]
396        unsafe fn decode(
397            &mut self,
398            decoder: &mut fidl::encoding::Decoder<'_, D>,
399            offset: usize,
400            _depth: fidl::encoding::Depth,
401        ) -> fidl::Result<()> {
402            decoder.debug_check_bounds::<Self>(offset);
403            // Verify that padding bytes are zero.
404            fidl::decode!(Metrics, D, &mut self.info, decoder, offset + 0, _depth)?;
405            Ok(())
406        }
407    }
408
409    impl fidl::encoding::ValueTypeMarker for VsyncSourceOnVsyncRequest {
410        type Borrowed<'a> = &'a Self;
411        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
412            value
413        }
414    }
415
416    unsafe impl fidl::encoding::TypeMarker for VsyncSourceOnVsyncRequest {
417        type Owned = Self;
418
419        #[inline(always)]
420        fn inline_align(_context: fidl::encoding::Context) -> usize {
421            8
422        }
423
424        #[inline(always)]
425        fn inline_size(_context: fidl::encoding::Context) -> usize {
426            8
427        }
428        #[inline(always)]
429        fn encode_is_copy() -> bool {
430            true
431        }
432
433        #[inline(always)]
434        fn decode_is_copy() -> bool {
435            true
436        }
437    }
438
439    unsafe impl<D: fidl::encoding::ResourceDialect>
440        fidl::encoding::Encode<VsyncSourceOnVsyncRequest, D> for &VsyncSourceOnVsyncRequest
441    {
442        #[inline]
443        unsafe fn encode(
444            self,
445            encoder: &mut fidl::encoding::Encoder<'_, D>,
446            offset: usize,
447            _depth: fidl::encoding::Depth,
448        ) -> fidl::Result<()> {
449            encoder.debug_check_bounds::<VsyncSourceOnVsyncRequest>(offset);
450            unsafe {
451                // Copy the object into the buffer.
452                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
453                (buf_ptr as *mut VsyncSourceOnVsyncRequest)
454                    .write_unaligned((self as *const VsyncSourceOnVsyncRequest).read());
455                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
456                // done second because the memcpy will write garbage to these bytes.
457            }
458            Ok(())
459        }
460    }
461    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i64, D>>
462        fidl::encoding::Encode<VsyncSourceOnVsyncRequest, D> for (T0,)
463    {
464        #[inline]
465        unsafe fn encode(
466            self,
467            encoder: &mut fidl::encoding::Encoder<'_, D>,
468            offset: usize,
469            depth: fidl::encoding::Depth,
470        ) -> fidl::Result<()> {
471            encoder.debug_check_bounds::<VsyncSourceOnVsyncRequest>(offset);
472            // Zero out padding regions. There's no need to apply masks
473            // because the unmasked parts will be overwritten by fields.
474            // Write the fields.
475            self.0.encode(encoder, offset + 0, depth)?;
476            Ok(())
477        }
478    }
479
480    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
481        for VsyncSourceOnVsyncRequest
482    {
483        #[inline(always)]
484        fn new_empty() -> Self {
485            Self { timestamp: fidl::new_empty!(i64, D) }
486        }
487
488        #[inline]
489        unsafe fn decode(
490            &mut self,
491            decoder: &mut fidl::encoding::Decoder<'_, D>,
492            offset: usize,
493            _depth: fidl::encoding::Depth,
494        ) -> fidl::Result<()> {
495            decoder.debug_check_bounds::<Self>(offset);
496            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
497            // Verify that padding bytes are zero.
498            // Copy from the buffer into the object.
499            unsafe {
500                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
501            }
502            Ok(())
503        }
504    }
505
506    impl fidl::encoding::ValueTypeMarker for VsyncSourceSetVsyncEnabledRequest {
507        type Borrowed<'a> = &'a Self;
508        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
509            value
510        }
511    }
512
513    unsafe impl fidl::encoding::TypeMarker for VsyncSourceSetVsyncEnabledRequest {
514        type Owned = Self;
515
516        #[inline(always)]
517        fn inline_align(_context: fidl::encoding::Context) -> usize {
518            1
519        }
520
521        #[inline(always)]
522        fn inline_size(_context: fidl::encoding::Context) -> usize {
523            1
524        }
525    }
526
527    unsafe impl<D: fidl::encoding::ResourceDialect>
528        fidl::encoding::Encode<VsyncSourceSetVsyncEnabledRequest, D>
529        for &VsyncSourceSetVsyncEnabledRequest
530    {
531        #[inline]
532        unsafe fn encode(
533            self,
534            encoder: &mut fidl::encoding::Encoder<'_, D>,
535            offset: usize,
536            _depth: fidl::encoding::Depth,
537        ) -> fidl::Result<()> {
538            encoder.debug_check_bounds::<VsyncSourceSetVsyncEnabledRequest>(offset);
539            // Delegate to tuple encoding.
540            fidl::encoding::Encode::<VsyncSourceSetVsyncEnabledRequest, D>::encode(
541                (<bool as fidl::encoding::ValueTypeMarker>::borrow(&self.enabled),),
542                encoder,
543                offset,
544                _depth,
545            )
546        }
547    }
548    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<bool, D>>
549        fidl::encoding::Encode<VsyncSourceSetVsyncEnabledRequest, D> for (T0,)
550    {
551        #[inline]
552        unsafe fn encode(
553            self,
554            encoder: &mut fidl::encoding::Encoder<'_, D>,
555            offset: usize,
556            depth: fidl::encoding::Depth,
557        ) -> fidl::Result<()> {
558            encoder.debug_check_bounds::<VsyncSourceSetVsyncEnabledRequest>(offset);
559            // Zero out padding regions. There's no need to apply masks
560            // because the unmasked parts will be overwritten by fields.
561            // Write the fields.
562            self.0.encode(encoder, offset + 0, depth)?;
563            Ok(())
564        }
565    }
566
567    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
568        for VsyncSourceSetVsyncEnabledRequest
569    {
570        #[inline(always)]
571        fn new_empty() -> Self {
572            Self { enabled: fidl::new_empty!(bool, D) }
573        }
574
575        #[inline]
576        unsafe fn decode(
577            &mut self,
578            decoder: &mut fidl::encoding::Decoder<'_, D>,
579            offset: usize,
580            _depth: fidl::encoding::Depth,
581        ) -> fidl::Result<()> {
582            decoder.debug_check_bounds::<Self>(offset);
583            // Verify that padding bytes are zero.
584            fidl::decode!(bool, D, &mut self.enabled, decoder, offset + 0, _depth)?;
585            Ok(())
586        }
587    }
588
589    impl Metrics {
590        #[inline(always)]
591        fn max_ordinal_present(&self) -> u64 {
592            if let Some(_) = self.maximum_refresh_rate_in_millihertz {
593                return 4;
594            }
595            if let Some(_) = self.recommended_device_pixel_ratio {
596                return 3;
597            }
598            if let Some(_) = self.extent_in_mm {
599                return 2;
600            }
601            if let Some(_) = self.extent_in_px {
602                return 1;
603            }
604            0
605        }
606    }
607
608    impl fidl::encoding::ValueTypeMarker for Metrics {
609        type Borrowed<'a> = &'a Self;
610        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
611            value
612        }
613    }
614
615    unsafe impl fidl::encoding::TypeMarker for Metrics {
616        type Owned = Self;
617
618        #[inline(always)]
619        fn inline_align(_context: fidl::encoding::Context) -> usize {
620            8
621        }
622
623        #[inline(always)]
624        fn inline_size(_context: fidl::encoding::Context) -> usize {
625            16
626        }
627    }
628
629    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Metrics, D> for &Metrics {
630        unsafe fn encode(
631            self,
632            encoder: &mut fidl::encoding::Encoder<'_, D>,
633            offset: usize,
634            mut depth: fidl::encoding::Depth,
635        ) -> fidl::Result<()> {
636            encoder.debug_check_bounds::<Metrics>(offset);
637            // Vector header
638            let max_ordinal: u64 = self.max_ordinal_present();
639            encoder.write_num(max_ordinal, offset);
640            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
641            // Calling encoder.out_of_line_offset(0) is not allowed.
642            if max_ordinal == 0 {
643                return Ok(());
644            }
645            depth.increment()?;
646            let envelope_size = 8;
647            let bytes_len = max_ordinal as usize * envelope_size;
648            #[allow(unused_variables)]
649            let offset = encoder.out_of_line_offset(bytes_len);
650            let mut _prev_end_offset: usize = 0;
651            if 1 > max_ordinal {
652                return Ok(());
653            }
654
655            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
656            // are envelope_size bytes.
657            let cur_offset: usize = (1 - 1) * envelope_size;
658
659            // Zero reserved fields.
660            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
661
662            // Safety:
663            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
664            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
665            //   envelope_size bytes, there is always sufficient room.
666            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_math__common::SizeU, D>(
667                self.extent_in_px.as_ref().map(
668                    <fidl_fuchsia_math__common::SizeU as fidl::encoding::ValueTypeMarker>::borrow,
669                ),
670                encoder,
671                offset + cur_offset,
672                depth,
673            )?;
674
675            _prev_end_offset = cur_offset + envelope_size;
676            if 2 > max_ordinal {
677                return Ok(());
678            }
679
680            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
681            // are envelope_size bytes.
682            let cur_offset: usize = (2 - 1) * envelope_size;
683
684            // Zero reserved fields.
685            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
686
687            // Safety:
688            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
689            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
690            //   envelope_size bytes, there is always sufficient room.
691            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_math__common::SizeU, D>(
692                self.extent_in_mm.as_ref().map(
693                    <fidl_fuchsia_math__common::SizeU as fidl::encoding::ValueTypeMarker>::borrow,
694                ),
695                encoder,
696                offset + cur_offset,
697                depth,
698            )?;
699
700            _prev_end_offset = cur_offset + envelope_size;
701            if 3 > max_ordinal {
702                return Ok(());
703            }
704
705            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
706            // are envelope_size bytes.
707            let cur_offset: usize = (3 - 1) * envelope_size;
708
709            // Zero reserved fields.
710            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
711
712            // Safety:
713            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
714            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
715            //   envelope_size bytes, there is always sufficient room.
716            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_math__common::VecF, D>(
717                self.recommended_device_pixel_ratio.as_ref().map(
718                    <fidl_fuchsia_math__common::VecF as fidl::encoding::ValueTypeMarker>::borrow,
719                ),
720                encoder,
721                offset + cur_offset,
722                depth,
723            )?;
724
725            _prev_end_offset = cur_offset + envelope_size;
726            if 4 > max_ordinal {
727                return Ok(());
728            }
729
730            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
731            // are envelope_size bytes.
732            let cur_offset: usize = (4 - 1) * envelope_size;
733
734            // Zero reserved fields.
735            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
736
737            // Safety:
738            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
739            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
740            //   envelope_size bytes, there is always sufficient room.
741            fidl::encoding::encode_in_envelope_optional::<u32, D>(
742                self.maximum_refresh_rate_in_millihertz
743                    .as_ref()
744                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
745                encoder,
746                offset + cur_offset,
747                depth,
748            )?;
749
750            _prev_end_offset = cur_offset + envelope_size;
751
752            Ok(())
753        }
754    }
755
756    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Metrics {
757        #[inline(always)]
758        fn new_empty() -> Self {
759            Self::default()
760        }
761
762        unsafe fn decode(
763            &mut self,
764            decoder: &mut fidl::encoding::Decoder<'_, D>,
765            offset: usize,
766            mut depth: fidl::encoding::Depth,
767        ) -> fidl::Result<()> {
768            decoder.debug_check_bounds::<Self>(offset);
769            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
770                None => return Err(fidl::Error::NotNullable),
771                Some(len) => len,
772            };
773            // Calling decoder.out_of_line_offset(0) is not allowed.
774            if len == 0 {
775                return Ok(());
776            };
777            depth.increment()?;
778            let envelope_size = 8;
779            let bytes_len = len * envelope_size;
780            let offset = decoder.out_of_line_offset(bytes_len)?;
781            // Decode the envelope for each type.
782            let mut _next_ordinal_to_read = 0;
783            let mut next_offset = offset;
784            let end_offset = offset + bytes_len;
785            _next_ordinal_to_read += 1;
786            if next_offset >= end_offset {
787                return Ok(());
788            }
789
790            // Decode unknown envelopes for gaps in ordinals.
791            while _next_ordinal_to_read < 1 {
792                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
793                _next_ordinal_to_read += 1;
794                next_offset += envelope_size;
795            }
796
797            let next_out_of_line = decoder.next_out_of_line();
798            let handles_before = decoder.remaining_handles();
799            if let Some((inlined, num_bytes, num_handles)) =
800                fidl::encoding::decode_envelope_header(decoder, next_offset)?
801            {
802                let member_inline_size =
803                    <fidl_fuchsia_math__common::SizeU as fidl::encoding::TypeMarker>::inline_size(
804                        decoder.context,
805                    );
806                if inlined != (member_inline_size <= 4) {
807                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
808                }
809                let inner_offset;
810                let mut inner_depth = depth.clone();
811                if inlined {
812                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
813                    inner_offset = next_offset;
814                } else {
815                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
816                    inner_depth.increment()?;
817                }
818                let val_ref = self
819                    .extent_in_px
820                    .get_or_insert_with(|| fidl::new_empty!(fidl_fuchsia_math__common::SizeU, D));
821                fidl::decode!(
822                    fidl_fuchsia_math__common::SizeU,
823                    D,
824                    val_ref,
825                    decoder,
826                    inner_offset,
827                    inner_depth
828                )?;
829                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
830                {
831                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
832                }
833                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
834                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
835                }
836            }
837
838            next_offset += envelope_size;
839            _next_ordinal_to_read += 1;
840            if next_offset >= end_offset {
841                return Ok(());
842            }
843
844            // Decode unknown envelopes for gaps in ordinals.
845            while _next_ordinal_to_read < 2 {
846                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
847                _next_ordinal_to_read += 1;
848                next_offset += envelope_size;
849            }
850
851            let next_out_of_line = decoder.next_out_of_line();
852            let handles_before = decoder.remaining_handles();
853            if let Some((inlined, num_bytes, num_handles)) =
854                fidl::encoding::decode_envelope_header(decoder, next_offset)?
855            {
856                let member_inline_size =
857                    <fidl_fuchsia_math__common::SizeU as fidl::encoding::TypeMarker>::inline_size(
858                        decoder.context,
859                    );
860                if inlined != (member_inline_size <= 4) {
861                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
862                }
863                let inner_offset;
864                let mut inner_depth = depth.clone();
865                if inlined {
866                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
867                    inner_offset = next_offset;
868                } else {
869                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
870                    inner_depth.increment()?;
871                }
872                let val_ref = self
873                    .extent_in_mm
874                    .get_or_insert_with(|| fidl::new_empty!(fidl_fuchsia_math__common::SizeU, D));
875                fidl::decode!(
876                    fidl_fuchsia_math__common::SizeU,
877                    D,
878                    val_ref,
879                    decoder,
880                    inner_offset,
881                    inner_depth
882                )?;
883                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
884                {
885                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
886                }
887                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
888                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
889                }
890            }
891
892            next_offset += envelope_size;
893            _next_ordinal_to_read += 1;
894            if next_offset >= end_offset {
895                return Ok(());
896            }
897
898            // Decode unknown envelopes for gaps in ordinals.
899            while _next_ordinal_to_read < 3 {
900                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
901                _next_ordinal_to_read += 1;
902                next_offset += envelope_size;
903            }
904
905            let next_out_of_line = decoder.next_out_of_line();
906            let handles_before = decoder.remaining_handles();
907            if let Some((inlined, num_bytes, num_handles)) =
908                fidl::encoding::decode_envelope_header(decoder, next_offset)?
909            {
910                let member_inline_size =
911                    <fidl_fuchsia_math__common::VecF as fidl::encoding::TypeMarker>::inline_size(
912                        decoder.context,
913                    );
914                if inlined != (member_inline_size <= 4) {
915                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
916                }
917                let inner_offset;
918                let mut inner_depth = depth.clone();
919                if inlined {
920                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
921                    inner_offset = next_offset;
922                } else {
923                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
924                    inner_depth.increment()?;
925                }
926                let val_ref = self
927                    .recommended_device_pixel_ratio
928                    .get_or_insert_with(|| fidl::new_empty!(fidl_fuchsia_math__common::VecF, D));
929                fidl::decode!(
930                    fidl_fuchsia_math__common::VecF,
931                    D,
932                    val_ref,
933                    decoder,
934                    inner_offset,
935                    inner_depth
936                )?;
937                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
938                {
939                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
940                }
941                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
942                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
943                }
944            }
945
946            next_offset += envelope_size;
947            _next_ordinal_to_read += 1;
948            if next_offset >= end_offset {
949                return Ok(());
950            }
951
952            // Decode unknown envelopes for gaps in ordinals.
953            while _next_ordinal_to_read < 4 {
954                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
955                _next_ordinal_to_read += 1;
956                next_offset += envelope_size;
957            }
958
959            let next_out_of_line = decoder.next_out_of_line();
960            let handles_before = decoder.remaining_handles();
961            if let Some((inlined, num_bytes, num_handles)) =
962                fidl::encoding::decode_envelope_header(decoder, next_offset)?
963            {
964                let member_inline_size =
965                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
966                if inlined != (member_inline_size <= 4) {
967                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
968                }
969                let inner_offset;
970                let mut inner_depth = depth.clone();
971                if inlined {
972                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
973                    inner_offset = next_offset;
974                } else {
975                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
976                    inner_depth.increment()?;
977                }
978                let val_ref = self
979                    .maximum_refresh_rate_in_millihertz
980                    .get_or_insert_with(|| fidl::new_empty!(u32, D));
981                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
982                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
983                {
984                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
985                }
986                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
987                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
988                }
989            }
990
991            next_offset += envelope_size;
992
993            // Decode the remaining unknown envelopes.
994            while next_offset < end_offset {
995                _next_ordinal_to_read += 1;
996                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
997                next_offset += envelope_size;
998            }
999
1000            Ok(())
1001        }
1002    }
1003}