// 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 = 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 = BGRA_8; // The pixel color space. ColorSpace color_space = SRGB; // The pixel arrangement in memory. Tiling tiling = LINEAR; // Specifies the interpretion of the alpha channel, if one exists. AlphaFormat alpha_format = OPAQUE; };