Skip to main content

fidl_fuchsia_ui_display_color_common/
fidl_fuchsia_ui_display_color_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#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
12#[repr(C)]
13pub struct ConverterSetMinimumRgbRequest {
14    pub minimum_rgb: u8,
15}
16
17impl fidl::Persistable for ConverterSetMinimumRgbRequest {}
18
19#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
20pub struct ConverterSetMinimumRgbResponse {
21    pub supported: bool,
22}
23
24impl fidl::Persistable for ConverterSetMinimumRgbResponse {}
25
26#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
27#[repr(C)]
28pub struct ConverterSetValuesResponse {
29    pub res: i32,
30}
31
32impl fidl::Persistable for ConverterSetValuesResponse {}
33
34/// The properties required to apply color conversion to the display.
35/// The conversion is applied to each pixel of the display according to the formula:
36///
37/// [coefficients * (pixel + preoffsets) + postoffsets].
38///
39/// where pixel is a column vector consisting of the pixel's 3 RGB components.
40#[derive(Clone, Debug, Default, PartialEq)]
41pub struct ConversionProperties {
42    /// The |coefficients| param represents a 3x3 matrix, where the values are given in
43    /// row-major order:
44    ///
45    /// | 0  1  2 |
46    /// | 3  4  5 |
47    /// | 6  7  8 |
48    pub coefficients: Option<[f32; 9]>,
49    /// Preoffsets and postoffsets represent a [3x1] vector each of RGB values.
50    pub preoffsets: Option<[f32; 3]>,
51    pub postoffsets: Option<[f32; 3]>,
52    #[doc(hidden)]
53    pub __source_breaking: fidl::marker::SourceBreaking,
54}
55
56impl fidl::Persistable for ConversionProperties {}
57
58pub mod converter_ordinals {
59    pub const SET_VALUES: u64 = 0x64131a672b34af8d;
60    pub const SET_MINIMUM_RGB: u64 = 0x45dd02bf82f653d1;
61}
62
63mod internal {
64    use super::*;
65
66    impl fidl::encoding::ValueTypeMarker for ConverterSetMinimumRgbRequest {
67        type Borrowed<'a> = &'a Self;
68        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
69            value
70        }
71    }
72
73    unsafe impl fidl::encoding::TypeMarker for ConverterSetMinimumRgbRequest {
74        type Owned = Self;
75
76        #[inline(always)]
77        fn inline_align(_context: fidl::encoding::Context) -> usize {
78            1
79        }
80
81        #[inline(always)]
82        fn inline_size(_context: fidl::encoding::Context) -> usize {
83            1
84        }
85        #[inline(always)]
86        fn encode_is_copy() -> bool {
87            true
88        }
89
90        #[inline(always)]
91        fn decode_is_copy() -> bool {
92            true
93        }
94    }
95
96    unsafe impl<D: fidl::encoding::ResourceDialect>
97        fidl::encoding::Encode<ConverterSetMinimumRgbRequest, D>
98        for &ConverterSetMinimumRgbRequest
99    {
100        #[inline]
101        unsafe fn encode(
102            self,
103            encoder: &mut fidl::encoding::Encoder<'_, D>,
104            offset: usize,
105            _depth: fidl::encoding::Depth,
106        ) -> fidl::Result<()> {
107            encoder.debug_check_bounds::<ConverterSetMinimumRgbRequest>(offset);
108            unsafe {
109                // Copy the object into the buffer.
110                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
111                (buf_ptr as *mut ConverterSetMinimumRgbRequest)
112                    .write_unaligned((self as *const ConverterSetMinimumRgbRequest).read());
113                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
114                // done second because the memcpy will write garbage to these bytes.
115            }
116            Ok(())
117        }
118    }
119    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u8, D>>
120        fidl::encoding::Encode<ConverterSetMinimumRgbRequest, D> for (T0,)
121    {
122        #[inline]
123        unsafe fn encode(
124            self,
125            encoder: &mut fidl::encoding::Encoder<'_, D>,
126            offset: usize,
127            depth: fidl::encoding::Depth,
128        ) -> fidl::Result<()> {
129            encoder.debug_check_bounds::<ConverterSetMinimumRgbRequest>(offset);
130            // Zero out padding regions. There's no need to apply masks
131            // because the unmasked parts will be overwritten by fields.
132            // Write the fields.
133            self.0.encode(encoder, offset + 0, depth)?;
134            Ok(())
135        }
136    }
137
138    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
139        for ConverterSetMinimumRgbRequest
140    {
141        #[inline(always)]
142        fn new_empty() -> Self {
143            Self { minimum_rgb: fidl::new_empty!(u8, D) }
144        }
145
146        #[inline]
147        unsafe fn decode(
148            &mut self,
149            decoder: &mut fidl::encoding::Decoder<'_, D>,
150            offset: usize,
151            _depth: fidl::encoding::Depth,
152        ) -> fidl::Result<()> {
153            decoder.debug_check_bounds::<Self>(offset);
154            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
155            // Verify that padding bytes are zero.
156            // Copy from the buffer into the object.
157            unsafe {
158                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 1);
159            }
160            Ok(())
161        }
162    }
163
164    impl fidl::encoding::ValueTypeMarker for ConverterSetMinimumRgbResponse {
165        type Borrowed<'a> = &'a Self;
166        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
167            value
168        }
169    }
170
171    unsafe impl fidl::encoding::TypeMarker for ConverterSetMinimumRgbResponse {
172        type Owned = Self;
173
174        #[inline(always)]
175        fn inline_align(_context: fidl::encoding::Context) -> usize {
176            1
177        }
178
179        #[inline(always)]
180        fn inline_size(_context: fidl::encoding::Context) -> usize {
181            1
182        }
183    }
184
185    unsafe impl<D: fidl::encoding::ResourceDialect>
186        fidl::encoding::Encode<ConverterSetMinimumRgbResponse, D>
187        for &ConverterSetMinimumRgbResponse
188    {
189        #[inline]
190        unsafe fn encode(
191            self,
192            encoder: &mut fidl::encoding::Encoder<'_, D>,
193            offset: usize,
194            _depth: fidl::encoding::Depth,
195        ) -> fidl::Result<()> {
196            encoder.debug_check_bounds::<ConverterSetMinimumRgbResponse>(offset);
197            // Delegate to tuple encoding.
198            fidl::encoding::Encode::<ConverterSetMinimumRgbResponse, D>::encode(
199                (<bool as fidl::encoding::ValueTypeMarker>::borrow(&self.supported),),
200                encoder,
201                offset,
202                _depth,
203            )
204        }
205    }
206    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<bool, D>>
207        fidl::encoding::Encode<ConverterSetMinimumRgbResponse, D> for (T0,)
208    {
209        #[inline]
210        unsafe fn encode(
211            self,
212            encoder: &mut fidl::encoding::Encoder<'_, D>,
213            offset: usize,
214            depth: fidl::encoding::Depth,
215        ) -> fidl::Result<()> {
216            encoder.debug_check_bounds::<ConverterSetMinimumRgbResponse>(offset);
217            // Zero out padding regions. There's no need to apply masks
218            // because the unmasked parts will be overwritten by fields.
219            // Write the fields.
220            self.0.encode(encoder, offset + 0, depth)?;
221            Ok(())
222        }
223    }
224
225    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
226        for ConverterSetMinimumRgbResponse
227    {
228        #[inline(always)]
229        fn new_empty() -> Self {
230            Self { supported: fidl::new_empty!(bool, D) }
231        }
232
233        #[inline]
234        unsafe fn decode(
235            &mut self,
236            decoder: &mut fidl::encoding::Decoder<'_, D>,
237            offset: usize,
238            _depth: fidl::encoding::Depth,
239        ) -> fidl::Result<()> {
240            decoder.debug_check_bounds::<Self>(offset);
241            // Verify that padding bytes are zero.
242            fidl::decode!(bool, D, &mut self.supported, decoder, offset + 0, _depth)?;
243            Ok(())
244        }
245    }
246
247    impl fidl::encoding::ValueTypeMarker for ConverterSetValuesResponse {
248        type Borrowed<'a> = &'a Self;
249        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
250            value
251        }
252    }
253
254    unsafe impl fidl::encoding::TypeMarker for ConverterSetValuesResponse {
255        type Owned = Self;
256
257        #[inline(always)]
258        fn inline_align(_context: fidl::encoding::Context) -> usize {
259            4
260        }
261
262        #[inline(always)]
263        fn inline_size(_context: fidl::encoding::Context) -> usize {
264            4
265        }
266        #[inline(always)]
267        fn encode_is_copy() -> bool {
268            true
269        }
270
271        #[inline(always)]
272        fn decode_is_copy() -> bool {
273            true
274        }
275    }
276
277    unsafe impl<D: fidl::encoding::ResourceDialect>
278        fidl::encoding::Encode<ConverterSetValuesResponse, D> for &ConverterSetValuesResponse
279    {
280        #[inline]
281        unsafe fn encode(
282            self,
283            encoder: &mut fidl::encoding::Encoder<'_, D>,
284            offset: usize,
285            _depth: fidl::encoding::Depth,
286        ) -> fidl::Result<()> {
287            encoder.debug_check_bounds::<ConverterSetValuesResponse>(offset);
288            unsafe {
289                // Copy the object into the buffer.
290                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
291                (buf_ptr as *mut ConverterSetValuesResponse)
292                    .write_unaligned((self as *const ConverterSetValuesResponse).read());
293                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
294                // done second because the memcpy will write garbage to these bytes.
295            }
296            Ok(())
297        }
298    }
299    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
300        fidl::encoding::Encode<ConverterSetValuesResponse, D> for (T0,)
301    {
302        #[inline]
303        unsafe fn encode(
304            self,
305            encoder: &mut fidl::encoding::Encoder<'_, D>,
306            offset: usize,
307            depth: fidl::encoding::Depth,
308        ) -> fidl::Result<()> {
309            encoder.debug_check_bounds::<ConverterSetValuesResponse>(offset);
310            // Zero out padding regions. There's no need to apply masks
311            // because the unmasked parts will be overwritten by fields.
312            // Write the fields.
313            self.0.encode(encoder, offset + 0, depth)?;
314            Ok(())
315        }
316    }
317
318    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
319        for ConverterSetValuesResponse
320    {
321        #[inline(always)]
322        fn new_empty() -> Self {
323            Self { res: fidl::new_empty!(i32, D) }
324        }
325
326        #[inline]
327        unsafe fn decode(
328            &mut self,
329            decoder: &mut fidl::encoding::Decoder<'_, D>,
330            offset: usize,
331            _depth: fidl::encoding::Depth,
332        ) -> fidl::Result<()> {
333            decoder.debug_check_bounds::<Self>(offset);
334            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
335            // Verify that padding bytes are zero.
336            // Copy from the buffer into the object.
337            unsafe {
338                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
339            }
340            Ok(())
341        }
342    }
343
344    impl ConversionProperties {
345        #[inline(always)]
346        fn max_ordinal_present(&self) -> u64 {
347            if let Some(_) = self.postoffsets {
348                return 3;
349            }
350            if let Some(_) = self.preoffsets {
351                return 2;
352            }
353            if let Some(_) = self.coefficients {
354                return 1;
355            }
356            0
357        }
358    }
359
360    impl fidl::encoding::ValueTypeMarker for ConversionProperties {
361        type Borrowed<'a> = &'a Self;
362        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
363            value
364        }
365    }
366
367    unsafe impl fidl::encoding::TypeMarker for ConversionProperties {
368        type Owned = Self;
369
370        #[inline(always)]
371        fn inline_align(_context: fidl::encoding::Context) -> usize {
372            8
373        }
374
375        #[inline(always)]
376        fn inline_size(_context: fidl::encoding::Context) -> usize {
377            16
378        }
379    }
380
381    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ConversionProperties, D>
382        for &ConversionProperties
383    {
384        unsafe fn encode(
385            self,
386            encoder: &mut fidl::encoding::Encoder<'_, D>,
387            offset: usize,
388            mut depth: fidl::encoding::Depth,
389        ) -> fidl::Result<()> {
390            encoder.debug_check_bounds::<ConversionProperties>(offset);
391            // Vector header
392            let max_ordinal: u64 = self.max_ordinal_present();
393            encoder.write_num(max_ordinal, offset);
394            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
395            // Calling encoder.out_of_line_offset(0) is not allowed.
396            if max_ordinal == 0 {
397                return Ok(());
398            }
399            depth.increment()?;
400            let envelope_size = 8;
401            let bytes_len = max_ordinal as usize * envelope_size;
402            #[allow(unused_variables)]
403            let offset = encoder.out_of_line_offset(bytes_len);
404            let mut _prev_end_offset: usize = 0;
405            if 1 > max_ordinal {
406                return Ok(());
407            }
408
409            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
410            // are envelope_size bytes.
411            let cur_offset: usize = (1 - 1) * envelope_size;
412
413            // Zero reserved fields.
414            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
415
416            // Safety:
417            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
418            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
419            //   envelope_size bytes, there is always sufficient room.
420            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Array<f32, 9>, D>(
421                self.coefficients.as_ref().map(
422                    <fidl::encoding::Array<f32, 9> as fidl::encoding::ValueTypeMarker>::borrow,
423                ),
424                encoder,
425                offset + cur_offset,
426                depth,
427            )?;
428
429            _prev_end_offset = cur_offset + envelope_size;
430            if 2 > max_ordinal {
431                return Ok(());
432            }
433
434            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
435            // are envelope_size bytes.
436            let cur_offset: usize = (2 - 1) * envelope_size;
437
438            // Zero reserved fields.
439            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
440
441            // Safety:
442            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
443            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
444            //   envelope_size bytes, there is always sufficient room.
445            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Array<f32, 3>, D>(
446                self.preoffsets.as_ref().map(
447                    <fidl::encoding::Array<f32, 3> as fidl::encoding::ValueTypeMarker>::borrow,
448                ),
449                encoder,
450                offset + cur_offset,
451                depth,
452            )?;
453
454            _prev_end_offset = cur_offset + envelope_size;
455            if 3 > max_ordinal {
456                return Ok(());
457            }
458
459            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
460            // are envelope_size bytes.
461            let cur_offset: usize = (3 - 1) * envelope_size;
462
463            // Zero reserved fields.
464            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
465
466            // Safety:
467            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
468            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
469            //   envelope_size bytes, there is always sufficient room.
470            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Array<f32, 3>, D>(
471                self.postoffsets.as_ref().map(
472                    <fidl::encoding::Array<f32, 3> as fidl::encoding::ValueTypeMarker>::borrow,
473                ),
474                encoder,
475                offset + cur_offset,
476                depth,
477            )?;
478
479            _prev_end_offset = cur_offset + envelope_size;
480
481            Ok(())
482        }
483    }
484
485    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ConversionProperties {
486        #[inline(always)]
487        fn new_empty() -> Self {
488            Self::default()
489        }
490
491        unsafe fn decode(
492            &mut self,
493            decoder: &mut fidl::encoding::Decoder<'_, D>,
494            offset: usize,
495            mut depth: fidl::encoding::Depth,
496        ) -> fidl::Result<()> {
497            decoder.debug_check_bounds::<Self>(offset);
498            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
499                None => return Err(fidl::Error::NotNullable),
500                Some(len) => len,
501            };
502            // Calling decoder.out_of_line_offset(0) is not allowed.
503            if len == 0 {
504                return Ok(());
505            };
506            depth.increment()?;
507            let envelope_size = 8;
508            let bytes_len = len * envelope_size;
509            let offset = decoder.out_of_line_offset(bytes_len)?;
510            // Decode the envelope for each type.
511            let mut _next_ordinal_to_read = 0;
512            let mut next_offset = offset;
513            let end_offset = offset + bytes_len;
514            _next_ordinal_to_read += 1;
515            if next_offset >= end_offset {
516                return Ok(());
517            }
518
519            // Decode unknown envelopes for gaps in ordinals.
520            while _next_ordinal_to_read < 1 {
521                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
522                _next_ordinal_to_read += 1;
523                next_offset += envelope_size;
524            }
525
526            let next_out_of_line = decoder.next_out_of_line();
527            let handles_before = decoder.remaining_handles();
528            if let Some((inlined, num_bytes, num_handles)) =
529                fidl::encoding::decode_envelope_header(decoder, next_offset)?
530            {
531                let member_inline_size =
532                    <fidl::encoding::Array<f32, 9> as fidl::encoding::TypeMarker>::inline_size(
533                        decoder.context,
534                    );
535                if inlined != (member_inline_size <= 4) {
536                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
537                }
538                let inner_offset;
539                let mut inner_depth = depth.clone();
540                if inlined {
541                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
542                    inner_offset = next_offset;
543                } else {
544                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
545                    inner_depth.increment()?;
546                }
547                let val_ref = self
548                    .coefficients
549                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Array<f32, 9>, D));
550                fidl::decode!(fidl::encoding::Array<f32, 9>, D, val_ref, decoder, inner_offset, inner_depth)?;
551                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
552                {
553                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
554                }
555                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
556                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
557                }
558            }
559
560            next_offset += envelope_size;
561            _next_ordinal_to_read += 1;
562            if next_offset >= end_offset {
563                return Ok(());
564            }
565
566            // Decode unknown envelopes for gaps in ordinals.
567            while _next_ordinal_to_read < 2 {
568                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
569                _next_ordinal_to_read += 1;
570                next_offset += envelope_size;
571            }
572
573            let next_out_of_line = decoder.next_out_of_line();
574            let handles_before = decoder.remaining_handles();
575            if let Some((inlined, num_bytes, num_handles)) =
576                fidl::encoding::decode_envelope_header(decoder, next_offset)?
577            {
578                let member_inline_size =
579                    <fidl::encoding::Array<f32, 3> as fidl::encoding::TypeMarker>::inline_size(
580                        decoder.context,
581                    );
582                if inlined != (member_inline_size <= 4) {
583                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
584                }
585                let inner_offset;
586                let mut inner_depth = depth.clone();
587                if inlined {
588                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
589                    inner_offset = next_offset;
590                } else {
591                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
592                    inner_depth.increment()?;
593                }
594                let val_ref = self
595                    .preoffsets
596                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Array<f32, 3>, D));
597                fidl::decode!(fidl::encoding::Array<f32, 3>, D, val_ref, decoder, inner_offset, inner_depth)?;
598                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
599                {
600                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
601                }
602                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
603                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
604                }
605            }
606
607            next_offset += envelope_size;
608            _next_ordinal_to_read += 1;
609            if next_offset >= end_offset {
610                return Ok(());
611            }
612
613            // Decode unknown envelopes for gaps in ordinals.
614            while _next_ordinal_to_read < 3 {
615                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
616                _next_ordinal_to_read += 1;
617                next_offset += envelope_size;
618            }
619
620            let next_out_of_line = decoder.next_out_of_line();
621            let handles_before = decoder.remaining_handles();
622            if let Some((inlined, num_bytes, num_handles)) =
623                fidl::encoding::decode_envelope_header(decoder, next_offset)?
624            {
625                let member_inline_size =
626                    <fidl::encoding::Array<f32, 3> as fidl::encoding::TypeMarker>::inline_size(
627                        decoder.context,
628                    );
629                if inlined != (member_inline_size <= 4) {
630                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
631                }
632                let inner_offset;
633                let mut inner_depth = depth.clone();
634                if inlined {
635                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
636                    inner_offset = next_offset;
637                } else {
638                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
639                    inner_depth.increment()?;
640                }
641                let val_ref = self
642                    .postoffsets
643                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Array<f32, 3>, D));
644                fidl::decode!(fidl::encoding::Array<f32, 3>, D, val_ref, decoder, inner_offset, inner_depth)?;
645                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
646                {
647                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
648                }
649                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
650                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
651                }
652            }
653
654            next_offset += envelope_size;
655
656            // Decode the remaining unknown envelopes.
657            while next_offset < end_offset {
658                _next_ordinal_to_read += 1;
659                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
660                next_offset += envelope_size;
661            }
662
663            Ok(())
664        }
665    }
666}