// 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.sysmem;

/// Describes how an image is represented.
// TODO(fxb/32119): change struct to table
struct ImageFormat {
    /// Row width in pixels.
    uint32 width;

    /// Number of rows.
    uint32 height;

    /// Number of layers within a multi-layered image.
    /// Defaults to 1 if not specified.
    uint32 layers = 1;

    /// Pixel format.
    PixelFormat pixel_format;

    /// Color space.
    ColorSpace color_space;

    array<ImagePlane>:4 planes;
};

struct ImagePlane {
    /// Byte offset of the start of the plane from the beginning of the image.
    uint32 byte_offset;

    /// Stride in bytes per row.
    /// Only meaningful for linear buffer formats.
    uint32 bytes_per_row;
};

/// Describes constraints for allocating images of some desired form.
// TODO(fxb/32119): change struct to table
struct ImageSpec {
    /// Minimum width in pixels.
    uint32 min_width;

    /// Minimum height in pixels.
    uint32 min_height;

    /// Number of layers within a multi-layered image.
    /// Defaults to 1 if not specified.
    uint32 layers = 1;

    /// Pixel format.
    PixelFormat pixel_format;

    /// Color space.
    ColorSpace color_space;

    // TODO(ZX-2270): Add tiling formats.
};
