// 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.
  MetricsEvent metrics;

  SizeChangeHintEvent size_change_hint;

  // Events which are always delivered, regardless of mask.
  ImportUnboundEvent import_unbound;
  ViewConnectedEvent view_connected;
  ViewDisconnectedEvent view_disconnected;
  ViewHolderDisconnectedEvent view_holder_disconnected;
  ViewAttachedToSceneEvent view_attached_to_scene;
  ViewDetachedFromSceneEvent view_detached_from_scene;
  ViewPropertiesChangedEvent view_properties_changed;
  ViewStateChangedEvent view_state_changed;
};

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