blob: 865e43e81e3fad5cd6fbe8eae0ef4547ec05af9a [file] [log] [blame]
// 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;
};