| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library fuchsia.images; |
| |
| /// Specifies how pixels are represented in the image buffer. |
| enum PixelFormat { |
| /// BGRA_8 |
| /// |
| /// A 32-bit four-component unsigned integer format. |
| /// Byte order: B, G, R, A (little-endian ARGB packed 32-bit word). |
| /// Equivalent to Skia `kBGRA_8888_SkColorType` color type. |
| /// Equivalent to Zircon `ARGB_8888` pixel format on little-endian arch. |
| BGRA_8 = 0; |
| |
| /// YUY2 |
| /// |
| /// 4:2:2 (2x down-sampled UV horizontally; full res UV vertically) |
| /// |
| /// A 32-bit component that contains information for 2 pixels: |
| /// Byte order: Y1, U, Y2, V |
| /// Unpacks to 2 RGB pixels, where RGB1 = func(Y1, U, V) |
| /// and RGB2 = func(Y2, U, V) |
| /// Equivalent to YUV422 |
| YUY2 = 1; |
| |
| /// NV12 |
| /// |
| /// 4:2:0 (2x down-sampled UV in both directions) |
| /// |
| /// Offset 0: |
| /// 8 bit per pixel Y plane with bytes YYY. |
| /// Offset height * stride: |
| /// 8 bit UV data interleaved bytes as UVUVUV. |
| /// |
| /// Y plane has line stride >= width. |
| /// |
| /// In this context, both width and height are required to be even. |
| /// |
| /// The UV data is separated into "lines", with each "line" having same byte |
| /// width as a line of Y data, and same "line" stride as Y data's line stride. |
| /// The UV data has height / 2 "lines". |
| /// |
| /// In converting to RGB, the UV data gets up-scaled by 2x in both directions |
| /// overall. This comment is intentionally silent on exactly how UV up-scaling |
| /// phase/filtering/signal processing works, as it's a complicated topic that |
| /// can vary by implementation, typically trading off speed and quality of the |
| /// up-scaling. See comments in relevant conversion code for approach taken |
| /// by any given convert path. The precise relative phase of the UV data is |
| /// not presently conveyed. |
| NV12 = 2; |
| |
| /// YV12 |
| /// |
| /// Like I420, except with V and U swapped. |
| /// |
| /// 4:2:0 (2x down-sampled UV in both directions) |
| /// |
| /// Offset 0: |
| /// 8 bit per pixel Y plane with bytes YYY. |
| /// Offset height * stride: |
| /// 8 bit V data with uv_stride = stride / 2 |
| /// Offset height * stride + uv_stride * height / 2: |
| /// 8 bit U data with uv_stride = stride / 2 |
| /// |
| /// Y plane has line stride >= width. |
| /// |
| /// Both width and height are required to be even. |
| YV12 = 3; |
| }; |
| |
| /// Specifies how pixel color information should be interpreted. |
| enum ColorSpace { |
| SRGB = 0; |
| }; |
| |
| /// Specifies how pixels are arranged in memory. |
| enum Tiling { |
| /// Pixels are packed linearly. |
| /// Equivalent to `VK_IMAGE_TILING_LINEAR`. |
| LINEAR = 0; |
| |
| /// Pixels are packed in a GPU-dependent optimal format. |
| /// Equivalent to `VK_IMAGE_TILING_OPTIMAL`. |
| GPU_OPTIMAL = 1; |
| }; |
| |
| /// Specifies how alpha information should be interpreted. |
| enum AlphaFormat { |
| /// Image is considered to be opaque. Alpha channel is ignored. |
| /// Blend function is: src.RGB |
| OPAQUE = 0; |
| /// Color channels have been premultiplied by alpha. |
| /// Blend function is: src.RGB + (dest.RGB * (1 - src.A)) |
| PREMULTIPLIED = 1; |
| /// Color channels have not been premultiplied by alpha. |
| /// Blend function is: (src.RGB * src.A) + (dest.RGB * (1 - src.A)) |
| NON_PREMULTIPLIED = 2; |
| }; |
| |
| enum Transform { |
| /// Pixels are displayed normally. |
| NORMAL = 0; |
| |
| /// Pixels are mirrored left-right. |
| FLIP_HORIZONTAL = 1; |
| |
| /// Pixels are flipped vertically. |
| FLIP_VERTICAL = 2; |
| |
| /// Pixels are flipped vertically and mirrored left-right. |
| FLIP_VERTICAL_AND_HORIZONTAL = 3; |
| }; |
| |
| /// Information about a graphical image (texture) including its format and size. |
| struct ImageInfo { |
| /// Specifies if the image should be mirrored before displaying. |
| Transform transform = Transform.NORMAL; |
| |
| /// The width and height of the image in pixels. |
| uint32 width; |
| uint32 height; |
| |
| /// The number of bytes per row in the image buffer. |
| uint32 stride; |
| |
| /// The pixel format of the image. |
| PixelFormat pixel_format = PixelFormat.BGRA_8; |
| |
| /// The pixel color space. |
| ColorSpace color_space = ColorSpace.SRGB; |
| |
| /// The pixel arrangement in memory. |
| Tiling tiling = Tiling.LINEAR; |
| |
| /// Specifies the interpretion of the alpha channel, if one exists. |
| AlphaFormat alpha_format = AlphaFormat.OPAQUE; |
| }; |