Skip to main content

display_utils/
pixel_format.rs

1// Copyright 2021 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#![allow(non_upper_case_globals)]
6
7use fidl_fuchsia_images2 as images2;
8use fidl_fuchsia_sysmem as sysmem;
9use std::{fmt, str};
10use thiserror::Error;
11
12/// Pixel format definitions that bridge different versions of sysmem / images2
13/// formats Fuchsia uses for display and GPU drivers' internal image type
14/// representation.
15///
16/// NOTE: The color-components are interpreted in memory in little-endian byte-order.
17/// E.g., PixelFormat::Bgra32 as [u8; 4] would have components [blue, green, red, alpha].
18#[derive(Debug, Clone, Copy, PartialEq)]
19pub enum PixelFormat {
20    /// Equivalent to fuchsia.sysmem.PixelFormatType.Invalid and
21    /// fuchsia.images2.PixelFormat.Invalid.
22    Invalid,
23    /// RGB only, 8 bits per each of R/G/B/A sample
24    ///
25    /// Equivalent to fuchsia.sysmem.PixelFormatType.R8G8B8A8 and
26    /// fuchsia.images2.PixelFormat.R8G8B8A8.
27    R8G8B8A8,
28    /// 32bpp BGRA, 1 plane.  RGB only, 8 bits per each of B/G/R/A sample.
29    ///
30    /// Equivalent to fuchsia.sysmem.PixelFormatType.Bgra32 and
31    /// fuchsia.images2.PixelFormat.Bgra32.
32    Bgra32,
33    /// YUV only, 8 bits per Y sample
34    ///
35    /// Equivalent to fuchsia.sysmem.PixelFormatType.I420 and
36    /// fuchsia.images2.PixelFormat.I420.
37    I420,
38    /// YUV only, 8 bits per Y sample
39    ///
40    /// Equivalent to fuchsia.sysmem.PixelFormatType.M420 and
41    /// fuchsia.images2.PixelFormat.M420.
42    M420,
43    /// YUV only, 8 bits per Y sample
44    ///
45    /// Equivalent to fuchsia.sysmem.PixelFormatType.Nv12 and
46    /// fuchsia.images2.PixelFormat.Nv12.
47    Nv12,
48    /// YUV only, 8 bits per Y sample
49    ///
50    /// Equivalent to fuchsia.sysmem.PixelFormatType.Yuy2 and
51    /// fuchsia.images2.PixelFormat.Yuy2.
52    Yuy2,
53    /// This value is reserved, and not currently used.
54    ///
55    /// Equivalent to fuchsia.sysmem.PixelFormatType.Mjpeg and
56    /// fuchsia.images2.PixelFormat.Mjpeg.
57    Mjpeg,
58    /// YUV only, 8 bits per Y sample
59    ///
60    /// Equivalent to fuchsia.sysmem.PixelFormatType.Yv12 and
61    /// fuchsia.images2.PixelFormat.Yv12.
62    Yv12,
63    /// 24bpp BGR, 1 plane. RGB only, 8 bits per each of B/G/R sample
64    ///
65    /// Equivalent to fuchsia.sysmem.PixelFormatType.Bgr24 and
66    /// fuchsia.images2.PixelFormat.Bgr24.
67    Bgr24,
68    /// 16bpp RGB, 1 plane. 5 bits (most significant) R, 6 bits G, 5 bits B
69    ///
70    /// Equivalent to fuchsia.sysmem.PixelFormatType.Rgb565 and
71    /// fuchsia.images2.PixelFormat.Rgb565.
72    Rgb565,
73    /// 8bpp RGB, 1 plane. 3 bits (most significant) R, 3 bits G, 2 bits B
74    ///
75    /// Equivalent to fuchsia.sysmem.PixelFormatType.Rgb332 and
76    /// fuchsia.images2.PixelFormat.Rgb332.
77    Rgb332,
78    /// 8bpp RGB, 1 plane. 2 bits (most significant) R, 2 bits G, 2 bits B
79    ///
80    /// Equivalent to fuchsia.sysmem.PixelFormatType.Rgb2220 and
81    /// fuchsia.images2.PixelFormat.Rgb2220.
82    Rgb2220,
83    /// 8bpp, Luminance-only (red, green and blue have identical values.)
84    ///
85    /// Equivalent to fuchsia.sysmem.PixelFormatType.L8 and
86    /// fuchsia.images2.PixelFormat.L8.
87    L8,
88    /// 8bpp, Red-only (Green and Blue are to be interpreted as 0).
89    ///
90    /// Equivalent to fuchsia.sysmem.PixelFormatType.R8 and
91    /// fuchsia.images2.PixelFormat.R8.
92    R8,
93    /// 16bpp RG, 1 plane. 8 bits R, 8 bits G.
94    ///
95    /// Equivalent to fuchsia.sysmem.PixelFormatType.R8G8 and
96    /// fuchsia.images2.PixelFormat.R8G8.
97    R8G8,
98    /// 32bpp RGBA, 1 plane. 2 bits A, 10 bits R/G/B.
99    ///
100    /// Equivalent to fuchsia.sysmem.PixelFormatType.A2R10G10B10 and
101    /// fuchsia.images2.PixelFormat.A2R10G10B10.
102    A2R10G10B10,
103    /// 32bpp BGRA, 1 plane. 2 bits A, 10 bits R/G/B.
104    ///
105    /// Equivalent to fuchsia.sysmem.PixelFormatType.A2B10G10R10 and
106    /// fuchsia.images2.PixelFormat.A2B10G10R10.
107    A2B10G10R10,
108    /// A client is explicitly indicating that the client does not care which
109    /// pixel format is chosen / used.
110    ///
111    /// Equivalent to fuchsia.sysmem.PixelFormatType.DoNotCare and
112    /// fuchsia.images2.PixelFormat.DoNotCare.
113    DoNotCare,
114}
115
116impl Default for PixelFormat {
117    fn default() -> PixelFormat {
118        PixelFormat::Invalid
119    }
120}
121
122impl From<images2::PixelFormat> for PixelFormat {
123    fn from(src: images2::PixelFormat) -> Self {
124        match src {
125            images2::PixelFormat::Invalid => Self::Invalid,
126            images2::PixelFormat::R8G8B8A8 => Self::R8G8B8A8,
127            images2::PixelFormat::B8G8R8A8 => Self::Bgra32,
128            images2::PixelFormat::I420 => Self::I420,
129            images2::PixelFormat::M420 => Self::M420,
130            images2::PixelFormat::Nv12 => Self::Nv12,
131            images2::PixelFormat::Yuy2 => Self::Yuy2,
132            images2::PixelFormat::Mjpeg => Self::Mjpeg,
133            images2::PixelFormat::Yv12 => Self::Yv12,
134            images2::PixelFormat::B8G8R8 => Self::Bgr24,
135            images2::PixelFormat::R5G6B5 => Self::Rgb565,
136            images2::PixelFormat::R3G3B2 => Self::Rgb332,
137            images2::PixelFormat::R2G2B2X2 => Self::Rgb2220,
138            images2::PixelFormat::L8 => Self::L8,
139            images2::PixelFormat::R8 => Self::R8,
140            images2::PixelFormat::R8G8 => Self::R8G8,
141            images2::PixelFormat::A2R10G10B10 => Self::A2R10G10B10,
142            images2::PixelFormat::A2B10G10R10 => Self::A2B10G10R10,
143            images2::PixelFormat::DoNotCare => Self::DoNotCare,
144            _ => Self::Invalid,
145        }
146    }
147}
148
149impl From<&images2::PixelFormat> for PixelFormat {
150    fn from(src: &images2::PixelFormat) -> Self {
151        Self::from(*src)
152    }
153}
154
155impl From<PixelFormat> for images2::PixelFormat {
156    fn from(src: PixelFormat) -> Self {
157        match src {
158            PixelFormat::Invalid => Self::Invalid,
159            PixelFormat::R8G8B8A8 => Self::R8G8B8A8,
160            PixelFormat::Bgra32 => Self::B8G8R8A8,
161            PixelFormat::I420 => Self::I420,
162            PixelFormat::M420 => Self::M420,
163            PixelFormat::Nv12 => Self::Nv12,
164            PixelFormat::Yuy2 => Self::Yuy2,
165            PixelFormat::Mjpeg => Self::Mjpeg,
166            PixelFormat::Yv12 => Self::Yv12,
167            PixelFormat::Bgr24 => Self::B8G8R8,
168            PixelFormat::Rgb565 => Self::R5G6B5,
169            PixelFormat::Rgb332 => Self::R3G3B2,
170            PixelFormat::Rgb2220 => Self::R2G2B2X2,
171            PixelFormat::L8 => Self::L8,
172            PixelFormat::R8 => Self::R8,
173            PixelFormat::R8G8 => Self::R8G8,
174            PixelFormat::A2R10G10B10 => Self::A2R10G10B10,
175            PixelFormat::A2B10G10R10 => Self::A2B10G10R10,
176            PixelFormat::DoNotCare => Self::DoNotCare,
177        }
178    }
179}
180
181impl From<&PixelFormat> for images2::PixelFormat {
182    fn from(src: &PixelFormat) -> Self {
183        Self::from(*src)
184    }
185}
186
187impl From<sysmem::PixelFormatType> for PixelFormat {
188    fn from(src: sysmem::PixelFormatType) -> Self {
189        match src {
190            sysmem::PixelFormatType::Invalid => Self::Invalid,
191            sysmem::PixelFormatType::R8G8B8A8 => Self::R8G8B8A8,
192            sysmem::PixelFormatType::Bgra32 => Self::Bgra32,
193            sysmem::PixelFormatType::I420 => Self::I420,
194            sysmem::PixelFormatType::M420 => Self::M420,
195            sysmem::PixelFormatType::Nv12 => Self::Nv12,
196            sysmem::PixelFormatType::Yuy2 => Self::Yuy2,
197            sysmem::PixelFormatType::Mjpeg => Self::Mjpeg,
198            sysmem::PixelFormatType::Yv12 => Self::Yv12,
199            sysmem::PixelFormatType::Bgr24 => Self::Bgr24,
200            sysmem::PixelFormatType::Rgb565 => Self::Rgb565,
201            sysmem::PixelFormatType::Rgb332 => Self::Rgb332,
202            sysmem::PixelFormatType::Rgb2220 => Self::Rgb2220,
203            sysmem::PixelFormatType::L8 => Self::L8,
204            sysmem::PixelFormatType::R8 => Self::R8,
205            sysmem::PixelFormatType::R8G8 => Self::R8G8,
206            sysmem::PixelFormatType::A2R10G10B10 => Self::A2R10G10B10,
207            sysmem::PixelFormatType::A2B10G10R10 => Self::A2B10G10R10,
208            sysmem::PixelFormatType::DoNotCare => Self::DoNotCare,
209        }
210    }
211}
212
213impl From<&sysmem::PixelFormatType> for PixelFormat {
214    fn from(src: &sysmem::PixelFormatType) -> Self {
215        Self::from(*src)
216    }
217}
218
219impl From<PixelFormat> for sysmem::PixelFormatType {
220    fn from(src: PixelFormat) -> Self {
221        match src {
222            PixelFormat::Invalid => Self::Invalid,
223            PixelFormat::R8G8B8A8 => Self::R8G8B8A8,
224            PixelFormat::Bgra32 => Self::Bgra32,
225            PixelFormat::I420 => Self::I420,
226            PixelFormat::M420 => Self::M420,
227            PixelFormat::Nv12 => Self::Nv12,
228            PixelFormat::Yuy2 => Self::Yuy2,
229            PixelFormat::Mjpeg => Self::Mjpeg,
230            PixelFormat::Yv12 => Self::Yv12,
231            PixelFormat::Bgr24 => Self::Bgr24,
232            PixelFormat::Rgb565 => Self::Rgb565,
233            PixelFormat::Rgb332 => Self::Rgb332,
234            PixelFormat::Rgb2220 => Self::Rgb2220,
235            PixelFormat::L8 => Self::L8,
236            PixelFormat::R8 => Self::R8,
237            PixelFormat::R8G8 => Self::R8G8,
238            PixelFormat::A2R10G10B10 => Self::A2R10G10B10,
239            PixelFormat::A2B10G10R10 => Self::A2B10G10R10,
240            PixelFormat::DoNotCare => Self::DoNotCare,
241        }
242    }
243}
244
245impl From<&PixelFormat> for sysmem::PixelFormatType {
246    fn from(src: &PixelFormat) -> Self {
247        Self::from(*src)
248    }
249}
250
251impl fmt::Display for PixelFormat {
252    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
253        let string: &str = match *self {
254            PixelFormat::Invalid => "(Invalid)",
255            PixelFormat::R8G8B8A8 => "RGBA 8888",
256            PixelFormat::Bgra32 => "BGRA 8888",
257            PixelFormat::I420 => "I420",
258            PixelFormat::M420 => "M420",
259            PixelFormat::Nv12 => "NV12",
260            PixelFormat::Yuy2 => "YUY2",
261            PixelFormat::Mjpeg => "MJPEG",
262            PixelFormat::Yv12 => "YV12",
263            PixelFormat::Bgr24 => "BGR 888",
264            PixelFormat::Rgb565 => "RGB 565",
265            PixelFormat::Rgb332 => "RGB 332",
266            PixelFormat::Rgb2220 => "RGB 2220",
267            PixelFormat::L8 => "Mono L8",
268            PixelFormat::R8 => "Mono R8",
269            PixelFormat::R8G8 => "R8G8",
270            PixelFormat::A2R10G10B10 => "A2 R10 G10 B10",
271            PixelFormat::A2B10G10R10 => "A2 B10 G10 R10",
272            PixelFormat::DoNotCare => "(Do not care)",
273        };
274        write!(f, "{}", string)
275    }
276}
277
278#[derive(Debug, PartialEq)]
279pub enum ParsePixelFormatError {
280    UnsupportedFormat(String),
281}
282
283impl fmt::Display for ParsePixelFormatError {
284    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
285        match self {
286            ParsePixelFormatError::UnsupportedFormat(s) => write!(f, "Unsupported format {}", s),
287        }
288    }
289}
290
291impl str::FromStr for PixelFormat {
292    type Err = ParsePixelFormatError;
293
294    fn from_str(s: &str) -> Result<Self, Self::Err> {
295        match s.to_ascii_lowercase().as_str() {
296            "invalid" => Ok(PixelFormat::Invalid),
297            "rgba8888" | "r8g8b8a8" | "rgba32" => Ok(PixelFormat::R8G8B8A8),
298            "bgra8888" | "b8g8r8a8" | "bgra32" => Ok(PixelFormat::Bgra32),
299            "i420" => Ok(PixelFormat::I420),
300            "m420" => Ok(PixelFormat::M420),
301            "nv12" => Ok(PixelFormat::Nv12),
302            "yuy2" => Ok(PixelFormat::Yuy2),
303            "mjpeg" => Ok(PixelFormat::Mjpeg),
304            "yv12" => Ok(PixelFormat::Yv12),
305            "bgr888" | "bgr24" => Ok(PixelFormat::Bgr24),
306            "rgb565" => Ok(PixelFormat::Rgb565),
307            "rgb332" => Ok(PixelFormat::Rgb332),
308            "rgb2220" => Ok(PixelFormat::Rgb2220),
309            "monol8" => Ok(PixelFormat::L8),
310            "monor8" => Ok(PixelFormat::R8),
311            "r8g8" => Ok(PixelFormat::R8G8),
312            "a2r10g10b10" => Ok(PixelFormat::A2R10G10B10),
313            "a2b10g10r10" => Ok(PixelFormat::A2B10G10R10),
314            "donotcare" => Ok(PixelFormat::DoNotCare),
315            _ => Err(ParsePixelFormatError::UnsupportedFormat(s.to_string())),
316        }
317    }
318}
319
320#[derive(Debug, Error, PartialEq)]
321pub enum GetBytesPerPixelError {
322    #[error("Unsupported format: {0}")]
323    UnsupportedFormat(PixelFormat),
324}
325
326/// Get number of bytes per pixel for given `pixel_format`.
327/// Currently only packed pixel formats are supported. Planar formats (e.g.
328/// NV12) are not supported.
329pub fn get_bytes_per_pixel(pixel_format: PixelFormat) -> Result<usize, GetBytesPerPixelError> {
330    match pixel_format {
331        PixelFormat::R8G8B8A8
332        | PixelFormat::Bgra32
333        | PixelFormat::A2R10G10B10
334        | PixelFormat::A2B10G10R10 => Ok(4),
335        PixelFormat::Bgr24 => Ok(3),
336        PixelFormat::Rgb565 | PixelFormat::R8G8 => Ok(2),
337        PixelFormat::Rgb332 | PixelFormat::Rgb2220 | PixelFormat::L8 | PixelFormat::R8 => Ok(1),
338        _ => Err(GetBytesPerPixelError::UnsupportedFormat(pixel_format)),
339    }
340}
341
342#[cfg(test)]
343mod tests {
344    use super::*;
345    use googletest::{expect_eq, expect_that, gtest, matchers};
346    use std::str::FromStr;
347
348    #[gtest]
349    #[fuchsia::test]
350    fn pixel_format_from_str_invalid() {
351        expect_that!(
352            &PixelFormat::from_str("bad"),
353            matchers::err(matchers::eq(&ParsePixelFormatError::UnsupportedFormat(
354                "bad".to_string()
355            )))
356        );
357    }
358
359    #[gtest]
360    #[fuchsia::test]
361    fn pixel_format_from_str_valid() {
362        expect_that!(
363            &PixelFormat::from_str("invalid"),
364            matchers::ok(matchers::eq(&PixelFormat::Invalid))
365        );
366        expect_that!(
367            &PixelFormat::from_str("rgba8888"),
368            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
369        );
370        expect_that!(
371            &PixelFormat::from_str("r8g8b8a8"),
372            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
373        );
374        expect_that!(
375            &PixelFormat::from_str("rgba32"),
376            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
377        );
378        expect_that!(
379            &PixelFormat::from_str("bgra8888"),
380            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
381        );
382        expect_that!(
383            &PixelFormat::from_str("b8g8r8a8"),
384            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
385        );
386        expect_that!(
387            &PixelFormat::from_str("bgra32"),
388            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
389        );
390        expect_that!(
391            &PixelFormat::from_str("i420"),
392            matchers::ok(matchers::eq(&PixelFormat::I420))
393        );
394        expect_that!(
395            &PixelFormat::from_str("m420"),
396            matchers::ok(matchers::eq(&PixelFormat::M420))
397        );
398        expect_that!(
399            &PixelFormat::from_str("nv12"),
400            matchers::ok(matchers::eq(&PixelFormat::Nv12))
401        );
402        expect_that!(
403            &PixelFormat::from_str("yuy2"),
404            matchers::ok(matchers::eq(&PixelFormat::Yuy2))
405        );
406        expect_that!(
407            &PixelFormat::from_str("mjpeg"),
408            matchers::ok(matchers::eq(&PixelFormat::Mjpeg))
409        );
410        expect_that!(
411            &PixelFormat::from_str("yv12"),
412            matchers::ok(matchers::eq(&PixelFormat::Yv12))
413        );
414        expect_that!(
415            &PixelFormat::from_str("bgr888"),
416            matchers::ok(matchers::eq(&PixelFormat::Bgr24))
417        );
418        expect_that!(
419            &PixelFormat::from_str("bgr24"),
420            matchers::ok(matchers::eq(&PixelFormat::Bgr24))
421        );
422        expect_that!(
423            &PixelFormat::from_str("rgb565"),
424            matchers::ok(matchers::eq(&PixelFormat::Rgb565))
425        );
426        expect_that!(
427            &PixelFormat::from_str("rgb332"),
428            matchers::ok(matchers::eq(&PixelFormat::Rgb332))
429        );
430        expect_that!(
431            &PixelFormat::from_str("rgb2220"),
432            matchers::ok(matchers::eq(&PixelFormat::Rgb2220))
433        );
434        expect_that!(
435            &PixelFormat::from_str("monol8"),
436            matchers::ok(matchers::eq(&PixelFormat::L8))
437        );
438        expect_that!(
439            &PixelFormat::from_str("monor8"),
440            matchers::ok(matchers::eq(&PixelFormat::R8))
441        );
442        expect_that!(
443            &PixelFormat::from_str("r8g8"),
444            matchers::ok(matchers::eq(&PixelFormat::R8G8))
445        );
446        expect_that!(
447            &PixelFormat::from_str("a2r10g10b10"),
448            matchers::ok(matchers::eq(&PixelFormat::A2R10G10B10))
449        );
450        expect_that!(
451            &PixelFormat::from_str("a2b10g10r10"),
452            matchers::ok(matchers::eq(&PixelFormat::A2B10G10R10))
453        );
454        expect_that!(
455            &PixelFormat::from_str("donotcare"),
456            matchers::ok(matchers::eq(&PixelFormat::DoNotCare))
457        );
458
459        expect_that!(
460            &PixelFormat::from_str("INVALID"),
461            matchers::ok(matchers::eq(&PixelFormat::Invalid))
462        );
463        expect_that!(
464            &PixelFormat::from_str("RGBA8888"),
465            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
466        );
467        expect_that!(
468            &PixelFormat::from_str("R8G8B8A8"),
469            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
470        );
471        expect_that!(
472            &PixelFormat::from_str("RGBA32"),
473            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
474        );
475        expect_that!(
476            &PixelFormat::from_str("BGRA8888"),
477            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
478        );
479        expect_that!(
480            &PixelFormat::from_str("B8G8R8A8"),
481            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
482        );
483        expect_that!(
484            &PixelFormat::from_str("BGRA32"),
485            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
486        );
487        expect_that!(
488            &PixelFormat::from_str("I420"),
489            matchers::ok(matchers::eq(&PixelFormat::I420))
490        );
491        expect_that!(
492            &PixelFormat::from_str("M420"),
493            matchers::ok(matchers::eq(&PixelFormat::M420))
494        );
495        expect_that!(
496            &PixelFormat::from_str("NV12"),
497            matchers::ok(matchers::eq(&PixelFormat::Nv12))
498        );
499        expect_that!(
500            &PixelFormat::from_str("YUY2"),
501            matchers::ok(matchers::eq(&PixelFormat::Yuy2))
502        );
503        expect_that!(
504            &PixelFormat::from_str("MJPEG"),
505            matchers::ok(matchers::eq(&PixelFormat::Mjpeg))
506        );
507        expect_that!(
508            &PixelFormat::from_str("YV12"),
509            matchers::ok(matchers::eq(&PixelFormat::Yv12))
510        );
511        expect_that!(
512            &PixelFormat::from_str("BGR888"),
513            matchers::ok(matchers::eq(&PixelFormat::Bgr24))
514        );
515        expect_that!(
516            &PixelFormat::from_str("BGR24"),
517            matchers::ok(matchers::eq(&PixelFormat::Bgr24))
518        );
519        expect_that!(
520            &PixelFormat::from_str("RGB565"),
521            matchers::ok(matchers::eq(&PixelFormat::Rgb565))
522        );
523        expect_that!(
524            &PixelFormat::from_str("RGB332"),
525            matchers::ok(matchers::eq(&PixelFormat::Rgb332))
526        );
527        expect_that!(
528            &PixelFormat::from_str("RGB2220"),
529            matchers::ok(matchers::eq(&PixelFormat::Rgb2220))
530        );
531        expect_that!(
532            &PixelFormat::from_str("MONOL8"),
533            matchers::ok(matchers::eq(&PixelFormat::L8))
534        );
535        expect_that!(
536            &PixelFormat::from_str("MONOR8"),
537            matchers::ok(matchers::eq(&PixelFormat::R8))
538        );
539        expect_that!(
540            &PixelFormat::from_str("R8G8"),
541            matchers::ok(matchers::eq(&PixelFormat::R8G8))
542        );
543        expect_that!(
544            &PixelFormat::from_str("A2R10G10B10"),
545            matchers::ok(matchers::eq(&PixelFormat::A2R10G10B10))
546        );
547        expect_that!(
548            &PixelFormat::from_str("A2B10G10R10"),
549            matchers::ok(matchers::eq(&PixelFormat::A2B10G10R10))
550        );
551        expect_that!(
552            &PixelFormat::from_str("DONOTCARE"),
553            matchers::ok(matchers::eq(&PixelFormat::DoNotCare))
554        );
555
556        expect_that!(
557            &PixelFormat::from_str("Invalid"),
558            matchers::ok(matchers::eq(&PixelFormat::Invalid))
559        );
560        expect_that!(
561            &PixelFormat::from_str("Rgba8888"),
562            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
563        );
564        expect_that!(
565            &PixelFormat::from_str("R8g8b8a8"),
566            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
567        );
568        expect_that!(
569            &PixelFormat::from_str("Rgba32"),
570            matchers::ok(matchers::eq(&PixelFormat::R8G8B8A8))
571        );
572        expect_that!(
573            &PixelFormat::from_str("Bgra8888"),
574            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
575        );
576        expect_that!(
577            &PixelFormat::from_str("B8g8r8a8"),
578            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
579        );
580        expect_that!(
581            &PixelFormat::from_str("Bgra32"),
582            matchers::ok(matchers::eq(&PixelFormat::Bgra32))
583        );
584        expect_that!(
585            &PixelFormat::from_str("I420"),
586            matchers::ok(matchers::eq(&PixelFormat::I420))
587        );
588        expect_that!(
589            &PixelFormat::from_str("M420"),
590            matchers::ok(matchers::eq(&PixelFormat::M420))
591        );
592        expect_that!(
593            &PixelFormat::from_str("Nv12"),
594            matchers::ok(matchers::eq(&PixelFormat::Nv12))
595        );
596        expect_that!(
597            &PixelFormat::from_str("Yuy2"),
598            matchers::ok(matchers::eq(&PixelFormat::Yuy2))
599        );
600        expect_that!(
601            &PixelFormat::from_str("Mjpeg"),
602            matchers::ok(matchers::eq(&PixelFormat::Mjpeg))
603        );
604        expect_that!(
605            &PixelFormat::from_str("Yv12"),
606            matchers::ok(matchers::eq(&PixelFormat::Yv12))
607        );
608        expect_that!(
609            &PixelFormat::from_str("Bgr888"),
610            matchers::ok(matchers::eq(&PixelFormat::Bgr24))
611        );
612        expect_that!(
613            &PixelFormat::from_str("Bgr24"),
614            matchers::ok(matchers::eq(&PixelFormat::Bgr24))
615        );
616        expect_that!(
617            &PixelFormat::from_str("Rgb565"),
618            matchers::ok(matchers::eq(&PixelFormat::Rgb565))
619        );
620        expect_that!(
621            &PixelFormat::from_str("Rgb332"),
622            matchers::ok(matchers::eq(&PixelFormat::Rgb332))
623        );
624        expect_that!(
625            &PixelFormat::from_str("Rgb2220"),
626            matchers::ok(matchers::eq(&PixelFormat::Rgb2220))
627        );
628        expect_that!(
629            &PixelFormat::from_str("Monol8"),
630            matchers::ok(matchers::eq(&PixelFormat::L8))
631        );
632        expect_that!(
633            &PixelFormat::from_str("Monor8"),
634            matchers::ok(matchers::eq(&PixelFormat::R8))
635        );
636        expect_that!(
637            &PixelFormat::from_str("R8g8"),
638            matchers::ok(matchers::eq(&PixelFormat::R8G8))
639        );
640        expect_that!(
641            &PixelFormat::from_str("A2r10g10b10"),
642            matchers::ok(matchers::eq(&PixelFormat::A2R10G10B10))
643        );
644        expect_that!(
645            &PixelFormat::from_str("A2b10g10r10"),
646            matchers::ok(matchers::eq(&PixelFormat::A2B10G10R10))
647        );
648        expect_that!(
649            &PixelFormat::from_str("DoNotCare"),
650            matchers::ok(matchers::eq(&PixelFormat::DoNotCare))
651        );
652    }
653
654    #[gtest]
655    #[fuchsia::test]
656    fn get_bytes_per_pixel_valid() {
657        expect_that!(&get_bytes_per_pixel(PixelFormat::R8G8B8A8), matchers::ok(matchers::eq(&4)));
658        expect_that!(&get_bytes_per_pixel(PixelFormat::Bgra32), matchers::ok(matchers::eq(&4)));
659        expect_that!(&get_bytes_per_pixel(PixelFormat::Bgr24), matchers::ok(matchers::eq(&3)));
660        expect_that!(&get_bytes_per_pixel(PixelFormat::Rgb565), matchers::ok(matchers::eq(&2)));
661        expect_that!(&get_bytes_per_pixel(PixelFormat::Rgb332), matchers::ok(matchers::eq(&1)));
662        expect_that!(&get_bytes_per_pixel(PixelFormat::Rgb2220), matchers::ok(matchers::eq(&1)));
663        expect_that!(&get_bytes_per_pixel(PixelFormat::L8), matchers::ok(matchers::eq(&1)));
664        expect_that!(&get_bytes_per_pixel(PixelFormat::R8), matchers::ok(matchers::eq(&1)));
665        expect_that!(&get_bytes_per_pixel(PixelFormat::R8G8), matchers::ok(matchers::eq(&2)));
666        expect_that!(
667            &get_bytes_per_pixel(PixelFormat::A2R10G10B10),
668            matchers::ok(matchers::eq(&4))
669        );
670        expect_that!(
671            &get_bytes_per_pixel(PixelFormat::A2B10G10R10),
672            matchers::ok(matchers::eq(&4))
673        );
674    }
675
676    #[gtest]
677    #[fuchsia::test]
678    fn get_bytes_per_pixel_invalid() {
679        expect_that!(
680            &get_bytes_per_pixel(PixelFormat::Invalid),
681            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
682                PixelFormat::Invalid
683            )))
684        );
685        expect_that!(
686            &get_bytes_per_pixel(PixelFormat::I420),
687            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
688                PixelFormat::I420
689            )))
690        );
691        expect_that!(
692            &get_bytes_per_pixel(PixelFormat::M420),
693            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
694                PixelFormat::M420
695            )))
696        );
697        expect_that!(
698            &get_bytes_per_pixel(PixelFormat::Nv12),
699            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
700                PixelFormat::Nv12
701            )))
702        );
703        expect_that!(
704            &get_bytes_per_pixel(PixelFormat::Yuy2),
705            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
706                PixelFormat::Yuy2
707            )))
708        );
709        expect_that!(
710            &get_bytes_per_pixel(PixelFormat::Mjpeg),
711            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
712                PixelFormat::Mjpeg
713            )))
714        );
715        expect_that!(
716            &get_bytes_per_pixel(PixelFormat::Yv12),
717            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
718                PixelFormat::Yv12
719            )))
720        );
721        expect_that!(
722            &get_bytes_per_pixel(PixelFormat::DoNotCare),
723            matchers::err(matchers::eq(&GetBytesPerPixelError::UnsupportedFormat(
724                PixelFormat::DoNotCare
725            )))
726        );
727    }
728
729    #[gtest]
730    #[fuchsia::test]
731    fn sysmem2_pixel_format_conversion() {
732        expect_eq!(
733            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::Invalid)),
734            images2::PixelFormat::Invalid
735        );
736        expect_eq!(
737            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::R8G8B8A8)),
738            images2::PixelFormat::R8G8B8A8
739        );
740        expect_eq!(
741            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::B8G8R8A8)),
742            images2::PixelFormat::B8G8R8A8
743        );
744        expect_eq!(
745            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::I420)),
746            images2::PixelFormat::I420
747        );
748        expect_eq!(
749            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::M420)),
750            images2::PixelFormat::M420
751        );
752        expect_eq!(
753            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::Nv12)),
754            images2::PixelFormat::Nv12
755        );
756        expect_eq!(
757            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::Yuy2)),
758            images2::PixelFormat::Yuy2
759        );
760        expect_eq!(
761            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::Mjpeg)),
762            images2::PixelFormat::Mjpeg
763        );
764        expect_eq!(
765            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::Yv12)),
766            images2::PixelFormat::Yv12
767        );
768        expect_eq!(
769            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::B8G8R8)),
770            images2::PixelFormat::B8G8R8
771        );
772        expect_eq!(
773            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::R5G6B5)),
774            images2::PixelFormat::R5G6B5
775        );
776        expect_eq!(
777            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::R3G3B2)),
778            images2::PixelFormat::R3G3B2
779        );
780        expect_eq!(
781            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::R2G2B2X2)),
782            images2::PixelFormat::R2G2B2X2
783        );
784        expect_eq!(
785            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::L8)),
786            images2::PixelFormat::L8
787        );
788        expect_eq!(
789            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::R8)),
790            images2::PixelFormat::R8
791        );
792        expect_eq!(
793            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::R8G8)),
794            images2::PixelFormat::R8G8
795        );
796        expect_eq!(
797            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::A2R10G10B10)),
798            images2::PixelFormat::A2R10G10B10
799        );
800        expect_eq!(
801            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::A2B10G10R10)),
802            images2::PixelFormat::A2B10G10R10
803        );
804        expect_eq!(
805            images2::PixelFormat::from(PixelFormat::from(images2::PixelFormat::DoNotCare)),
806            images2::PixelFormat::DoNotCare
807        );
808    }
809
810    #[gtest]
811    #[fuchsia::test]
812    fn sysmem_pixel_format_conversion() {
813        expect_eq!(
814            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Invalid)),
815            sysmem::PixelFormatType::Invalid
816        );
817        expect_eq!(
818            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::R8G8B8A8)),
819            sysmem::PixelFormatType::R8G8B8A8
820        );
821        expect_eq!(
822            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Bgra32)),
823            sysmem::PixelFormatType::Bgra32
824        );
825        expect_eq!(
826            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::I420)),
827            sysmem::PixelFormatType::I420
828        );
829        expect_eq!(
830            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::M420)),
831            sysmem::PixelFormatType::M420
832        );
833        expect_eq!(
834            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Nv12)),
835            sysmem::PixelFormatType::Nv12
836        );
837        expect_eq!(
838            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Yuy2)),
839            sysmem::PixelFormatType::Yuy2
840        );
841        expect_eq!(
842            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Mjpeg)),
843            sysmem::PixelFormatType::Mjpeg
844        );
845        expect_eq!(
846            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Yv12)),
847            sysmem::PixelFormatType::Yv12
848        );
849        expect_eq!(
850            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Bgr24)),
851            sysmem::PixelFormatType::Bgr24
852        );
853        expect_eq!(
854            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Rgb565)),
855            sysmem::PixelFormatType::Rgb565
856        );
857        expect_eq!(
858            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Rgb332)),
859            sysmem::PixelFormatType::Rgb332
860        );
861        expect_eq!(
862            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::Rgb2220)),
863            sysmem::PixelFormatType::Rgb2220
864        );
865        expect_eq!(
866            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::L8)),
867            sysmem::PixelFormatType::L8
868        );
869        expect_eq!(
870            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::R8)),
871            sysmem::PixelFormatType::R8
872        );
873        expect_eq!(
874            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::R8G8)),
875            sysmem::PixelFormatType::R8G8
876        );
877        expect_eq!(
878            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::A2R10G10B10)),
879            sysmem::PixelFormatType::A2R10G10B10
880        );
881        expect_eq!(
882            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::A2B10G10R10)),
883            sysmem::PixelFormatType::A2B10G10R10
884        );
885        expect_eq!(
886            sysmem::PixelFormatType::from(PixelFormat::from(sysmem::PixelFormatType::DoNotCare)),
887            sysmem::PixelFormatType::DoNotCare
888        );
889    }
890
891    #[gtest]
892    #[fuchsia::test]
893    fn sysmem2_to_sysmem_pixel_format_conversion() {
894        expect_eq!(
895            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::Invalid)),
896            sysmem::PixelFormatType::Invalid
897        );
898        expect_eq!(
899            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::R8G8B8A8)),
900            sysmem::PixelFormatType::R8G8B8A8
901        );
902        expect_eq!(
903            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::B8G8R8A8)),
904            sysmem::PixelFormatType::Bgra32
905        );
906        expect_eq!(
907            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::I420)),
908            sysmem::PixelFormatType::I420
909        );
910        expect_eq!(
911            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::M420)),
912            sysmem::PixelFormatType::M420
913        );
914        expect_eq!(
915            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::Nv12)),
916            sysmem::PixelFormatType::Nv12
917        );
918        expect_eq!(
919            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::Yuy2)),
920            sysmem::PixelFormatType::Yuy2
921        );
922        expect_eq!(
923            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::Mjpeg)),
924            sysmem::PixelFormatType::Mjpeg
925        );
926        expect_eq!(
927            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::Yv12)),
928            sysmem::PixelFormatType::Yv12
929        );
930        expect_eq!(
931            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::B8G8R8)),
932            sysmem::PixelFormatType::Bgr24
933        );
934        expect_eq!(
935            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::R5G6B5)),
936            sysmem::PixelFormatType::Rgb565
937        );
938        expect_eq!(
939            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::R3G3B2)),
940            sysmem::PixelFormatType::Rgb332
941        );
942        expect_eq!(
943            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::R2G2B2X2)),
944            sysmem::PixelFormatType::Rgb2220
945        );
946        expect_eq!(
947            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::L8)),
948            sysmem::PixelFormatType::L8
949        );
950        expect_eq!(
951            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::R8)),
952            sysmem::PixelFormatType::R8
953        );
954        expect_eq!(
955            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::R8G8)),
956            sysmem::PixelFormatType::R8G8
957        );
958        expect_eq!(
959            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::A2R10G10B10)),
960            sysmem::PixelFormatType::A2R10G10B10
961        );
962        expect_eq!(
963            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::A2B10G10R10)),
964            sysmem::PixelFormatType::A2B10G10R10
965        );
966        expect_eq!(
967            sysmem::PixelFormatType::from(PixelFormat::from(images2::PixelFormat::DoNotCare)),
968            sysmem::PixelFormatType::DoNotCare
969        );
970    }
971
972    #[gtest]
973    #[fuchsia::test]
974    fn sysmem_to_sysmem2_pixel_format_conversion() {
975        expect_eq!(
976            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Invalid)),
977            images2::PixelFormat::Invalid
978        );
979        expect_eq!(
980            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::R8G8B8A8)),
981            images2::PixelFormat::R8G8B8A8
982        );
983        expect_eq!(
984            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Bgra32)),
985            images2::PixelFormat::B8G8R8A8
986        );
987        expect_eq!(
988            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::I420)),
989            images2::PixelFormat::I420
990        );
991        expect_eq!(
992            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::M420)),
993            images2::PixelFormat::M420
994        );
995        expect_eq!(
996            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Nv12)),
997            images2::PixelFormat::Nv12
998        );
999        expect_eq!(
1000            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Yuy2)),
1001            images2::PixelFormat::Yuy2
1002        );
1003        expect_eq!(
1004            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Mjpeg)),
1005            images2::PixelFormat::Mjpeg
1006        );
1007        expect_eq!(
1008            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Yv12)),
1009            images2::PixelFormat::Yv12
1010        );
1011        expect_eq!(
1012            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Bgr24)),
1013            images2::PixelFormat::B8G8R8
1014        );
1015        expect_eq!(
1016            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Rgb565)),
1017            images2::PixelFormat::R5G6B5
1018        );
1019        expect_eq!(
1020            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Rgb332)),
1021            images2::PixelFormat::R3G3B2
1022        );
1023        expect_eq!(
1024            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::Rgb2220)),
1025            images2::PixelFormat::R2G2B2X2
1026        );
1027        expect_eq!(
1028            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::L8)),
1029            images2::PixelFormat::L8
1030        );
1031        expect_eq!(
1032            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::R8)),
1033            images2::PixelFormat::R8
1034        );
1035        expect_eq!(
1036            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::R8G8)),
1037            images2::PixelFormat::R8G8
1038        );
1039        expect_eq!(
1040            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::A2R10G10B10)),
1041            images2::PixelFormat::A2R10G10B10
1042        );
1043        expect_eq!(
1044            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::A2B10G10R10)),
1045            images2::PixelFormat::A2B10G10R10
1046        );
1047        expect_eq!(
1048            images2::PixelFormat::from(PixelFormat::from(sysmem::PixelFormatType::DoNotCare)),
1049            images2::PixelFormat::DoNotCare
1050        );
1051    }
1052}