|  | // 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; | 
|  |  | 
|  | /// R8G8B8A8 | 
|  | /// | 
|  | /// A 32-bit four-component unsigned integer format. | 
|  | /// Byte order: R, G, B, A (little-endian ABGR packed 32-bit word). | 
|  | /// Equivalent to Skia `kRGBA_8888_SkColorType` color type. | 
|  | /// Equivalent to Zircon `ABGR_8888` pixel format on little-endian arch. | 
|  | /// | 
|  | /// This format can only be used with VK_DEVICE_MEMORY. | 
|  | R8G8B8A8 = 4; | 
|  | }; | 
|  |  | 
|  | /// 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; | 
|  | }; |