// 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, legacy=true)
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, legacy=true)
type ColorRgba = struct {
    red uint8;
    green uint8;
    blue uint8;
    alpha uint8;
};

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

@available(deprecated=13, removed=17, legacy=true)
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, legacy=true)
type Plane3 = struct {
    dir vec3;
    dist float32;
};

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

@available(deprecated=13, removed=17, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
type QuaternionValue = struct {
    value Quaternion;
    variable_id uint32;
};

@available(deprecated=13, removed=17, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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, legacy=true)
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;
};
