// Copyright 2017 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.ui.gfx;

type vec2 = struct {
    x float32;
    y float32;
};

type vec3 = struct {
    x float32;
    y float32;
    z float32;
};

@available(deprecated=13, removed=17)
type vec4 = struct {
    x float32;
    y float32;
    z float32;
    w float32;
};

type mat4 = struct {
    /// Column major order.
    matrix array<float32, 16>;
};

/// sRGB color space and nonlinear transfer function.
// TODO(https://fxbug.dev/42097574): use float32s instead of uint8.
@available(deprecated=13, removed=17)
type ColorRgba = struct {
    red uint8;
    green uint8;
    blue uint8;
    alpha uint8;
};

@available(deprecated=13, removed=17)
type ColorRgb = struct {
    red float32;
    green float32;
    blue float32;
};

@available(deprecated=13, removed=17)
type Quaternion = struct {
    x float32;
    y float32;
    z float32;
    w float32;
};

/// Oriented plane described by a normal vector and a distance
/// from the origin along that vector.
@available(deprecated=13, removed=17)
type Plane3 = struct {
    dir vec3;
    dist float32;
};

@available(deprecated=13, removed=17)
type FactoredTransform = struct {
    translation vec3;
    scale vec3;
    /// Point around which rotation and scaling occur.
    anchor vec3;
    rotation Quaternion;
};

@available(deprecated=13, removed=17)
type Value = strict union {
    1: vector1 float32;
    2: vector2 vec2;
    3: vector3 vec3;
    4: vector4 vec4;
    5: matrix4x4 mat4;
    6: color_rgba ColorRgba;
    7: color_rgb ColorRgb;
    /// Degrees of counter-clockwise rotation in the XY plane.
    8: degrees float32;
    9: quaternion Quaternion;
    10: transform FactoredTransform;
    /// ID of a value-producing resource (an animation or an expression).
    /// The type of this value matches the type produced by the named resource.
    11: variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a float32, and `value` is ignored.
@available(deprecated=13, removed=17)
type FloatValue = struct {
    value float32;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a vec2, and `value` is ignored.
@available(deprecated=13, removed=17)
type Vector2Value = struct {
    value vec2;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a vec3, and `value` is ignored.
@available(deprecated=13, removed=17)
type Vector3Value = struct {
    value vec3;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a vec4, and `value` is ignored.
@available(deprecated=13, removed=17)
type Vector4Value = struct {
    value vec4;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a vec4, and `value` is ignored.
@available(deprecated=13, removed=17)
type Matrix4Value = struct {
    value mat4;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a ColorRgb, and `value` is ignored.
@available(deprecated=13, removed=17)
type ColorRgbValue = struct {
    value ColorRgb;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a ColorRgba, and `value` is ignored.
@available(deprecated=13, removed=17)
type ColorRgbaValue = struct {
    value ColorRgba;
    variable_id uint32;
};

/// A value that is specified explicitly by `value` if `variable_id` is zero,
/// or is the value produced by the resource identified by `variable_id`, e.g.
/// an animation or expression.  In the latter case, the value produced by the
/// resource must be a Quaternion, and `value` is ignored.
@available(deprecated=13, removed=17)
type QuaternionValue = struct {
    value Quaternion;
    variable_id uint32;
};

@available(deprecated=13, removed=17)
type ValueType = strict enum {
    kNone = 0;
    kVector1 = 1;
    kVector2 = 2;
    kVector3 = 3;
    kVector4 = 4;
    kMatrix4 = 5;
    kColorRgb = 6;
    kColorRgba = 7;
    kQuaternion = 8;
    kFactoredTransform = 9;
};

/// Describes how nodes interact with hit testings.
@available(deprecated=13, removed=17)
type HitTestBehavior = strict enum {
    /// Apply hit testing to the node's content, its parts, and its children.
    kDefault = 0;

    /// Suppress hit testing of the node and everything it contains.
    kSuppress = 1;
};

/// Rendering target metrics associated with a node.
/// See also `MetricsEvent`.
@available(deprecated=13, removed=17)
type Metrics = struct {
    /// The ratio between the size of one logical pixel within the node's local
    /// coordinate system and the size of one physical pixel of the rendering
    /// target.
    ///
    /// This scale factors change in relation to the resolution of the rendering
    /// target and the scale transformations applied by containing nodes.
    /// They are always strictly positive and non-zero.
    ///
    /// For example, suppose the rendering target is a high resolution display
    /// with a device pixel ratio of 2.0 meaning that each logical pixel
    /// within the model corresponds to two physical pixels of the display.
    /// Assuming no scale transformations affect the node, then its metrics event
    /// will report a scale factor of 2.0.
    ///
    /// Building on this example, if instead the node's parent applies a
    /// scale transformation of 0.25 to the node, then the node's metrics event
    /// will report a scale factor of 0.5 indicating that the node should render
    /// its content at a reduced resolution and level of detail since a smaller
    /// area of physical pixels (half the size in each dimension) will be rendered.
    scale_x float32;
    scale_y float32;
    scale_z float32;
};

/// Represents an axis-aligned bounding box.
///
/// If any of the dimensions has a negative extent (e.g. max.x < min.x) then the
/// bounding box is treated as empty. It is valid for a client to define an
/// empty bounding box.
///
/// An "empty bounding box" is one that does not admit a point inhabitant.
/// Note that a zero-volume, zero-area bounding box (e.g., a point like
/// (0,0,0)-(0,0,0), or a line like (0,0,0)-(1,0,0)) is thus not empty.
type BoundingBox = struct {
    min vec3;
    max vec3;
};

/// Represents the properties for a View.
@available(deprecated=13, removed=17)
type ViewProperties = struct {
    /// The View's bounding box extents can be defined as:
    ///    { bounding_box.min, bounding_box.max }
    /// Content contained within the View is clipped to this bounding box.
    ///
    // TODO(https://fxbug.dev/42098189): should we just have a vec3 extent instead of a bounding box
    // with a potentially non-zero min?
    bounding_box BoundingBox;

    /// `insets_from_min` and `insets_from_max` specify the distances between the
    /// view's bounding box and that of its parent.
    ///
    /// These properties are not strictly enforced by Scenic, but only used
    /// as hints for clients and other components that receives ViewProperties:
    ///
    /// View clients can assume that anything drawn outside of
    ///    { bounding_box.min + inset_from_min, bounding_box.max - inset_from_max }
    /// may be obscured by an ancestor view. The reason for obscuring, and the rules
    /// surrounding it, is specific to each product.
    inset_from_min vec3;
    inset_from_max vec3;

    /// Whether the View can receive a focus event; default is true.  When
    /// false, and this View is eligible to receive a focus event, no
    /// focus/unfocus event is actually sent to any View.
    @allow_deprecated_struct_defaults
    focus_change bool = true;

    /// Whether the View allows geometrically underlying Views to receive input;
    /// default is true. When false, Scenic does not send input events to
    /// underlying Views.
    @allow_deprecated_struct_defaults
    downward_input bool = true;
};

/// Represents the state of a View in Scenic.
@available(deprecated=13, removed=17)
type ViewState = struct {
    /// Whether the View is rendering. Default is false. Delivered to the View's
    /// corresponding ViewHolder after the View's first frame render request.
    is_rendering bool;
};
