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

/// Reports metrics information.
/// This event type is only reported for node resources.
const uint32 kMetricsEventMask = 1;
const uint32 kSizeChangeHintEventMask = 2;

/// These are all of the types of events which can be reported by a `Session`.
/// Use `SetEventMaskCmd` to enable event delivery for a resource.
union Event {
    /// Events which are controlled by a mask.
     1: MetricsEvent metrics;

     2: SizeChangeHintEvent size_change_hint;

    /// Events which are always delivered, regardless of mask.
     3: ImportUnboundEvent import_unbound;
     4: ViewConnectedEvent view_connected;
     5: ViewDisconnectedEvent view_disconnected;
     6: ViewHolderDisconnectedEvent view_holder_disconnected;
     7: ViewAttachedToSceneEvent view_attached_to_scene;
     8: ViewDetachedFromSceneEvent view_detached_from_scene;
     9: ViewPropertiesChangedEvent view_properties_changed;
    10: ViewStateChangedEvent view_state_changed;
    11: ViewHolderConnectedEvent view_holder_connected;
};

/// Provides rendering target metrics information about the specified node.
///
/// This event is delivered when the following conditions are true:
/// - The node is a descendant of a `Scene`.
/// - The node has `kMetricsEventMask` set to an enabled state.
/// - The node's metrics have changed since they were last delivered, or since
///   `kMetricsEventMask` transitioned from a disabled state to an enabled state.
///
/// Subscribe to this event to receive information about the scale factors you
/// should apply when generating textures for your nodes.
struct MetricsEvent {
    uint32 node_id;
    Metrics metrics;
};

/// Delivered in response to a size change hint from a parent node
/// (SendSizeChangeHintCmd).
///
/// This event is delivered when the following conditions are true:
/// - The node has `kSizeChangeEventMask` set to an enabled state.
/// - A parent node has sent a SendSizeChangeHintCmd.
///
/// Subscribe to this event to receive information about how large textures you
/// will need in the near future for your nodes. The canonical use case is to
/// pre-allocate memory to avoid repeated re-allocations.
struct SizeChangeHintEvent {
    uint32 node_id;
    float32 width_change_factor;
    float32 height_change_factor;
};

/// Delivered when the imported resource with the given ID is no longer bound to
/// its host resource, or if the imported resource can not be bound because
/// the host resource is not available.
struct ImportUnboundEvent {
    uint32 resource_id;
};

/// Delivered to a ViewHolder's Session when its peer View is connected.
struct ViewConnectedEvent {
    uint32 view_holder_id;
};

/// Delivered to a ViewHolder's Session when its peer View is disconnected or
/// destroyed.
///
/// If the View is destroyed before the connection is established, then this
/// event will be delivered immediately when the ViewHolder attempts to connect.
struct ViewDisconnectedEvent {
    uint32 view_holder_id;
};

/// Delivered to a View's Session when its peer ViewHolder is disconnected or
/// destroyed.
///
/// If the ViewHolder is destroyed before the connection is established, then
/// this event will be delivered immediately when the View attempts to connect.
struct ViewHolderDisconnectedEvent {
    uint32 view_id;
};

/// Delivered to a View's Session when its peer ViewHolder is connected.
///
/// If the ViewHolder is destroyed before the connection is established, then
/// this event will not be delivered.
struct ViewHolderConnectedEvent {
    uint32 view_id;
};

/// Delivered to a View's Session when the parent ViewHolder for the given View
/// becomes a part of a Scene.
///
/// A ViewHolder is considered to be part of a Scene if there is an unbroken
/// chain of parent-child relationships between the Scene node and the
/// ViewHolder node.
struct ViewAttachedToSceneEvent {
    uint32 view_id;
    ViewProperties properties;
};

/// Delivered to a View's Session when the parent ViewHolder for the given View
/// is no longer part of a scene.
///
/// This can happen if the ViewHolder is detached directly from the scene, or
/// if one of its parent nodes is.
///
/// A ViewHolder is considered to be part of a Scene if there is an unbroken
/// chain of parent-child relationships between the Scene node and the
/// ViewHolder node.
struct ViewDetachedFromSceneEvent {
    uint32 view_id;
};

/// Delivered when the parent ViewHolder for the given View makes a change to
/// the View's properties.
struct ViewPropertiesChangedEvent {
    uint32 view_id;
    ViewProperties properties;
};

/// Delivered to a ViewHolder's Session when its peer View's state has changed.
struct ViewStateChangedEvent {
    uint32 view_holder_id;
    ViewState state;
};
