// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

[DartPackage="mojo_services"]
module mojo.gfx.composition;

import "mojo/services/geometry/interfaces/geometry.mojom";
import "mojo/services/gfx/composition/interfaces/scene_token.mojom";

// Determines how a node behaves during hit testing.
//
// See |Node| for more details of the hit testing traversal process.
struct HitTestBehavior {
  // The visibility specifies how a node itself is hit and its effect on
  // the hit testing traversal.
  enum Visibility {
    // The node can be hit and prevents other targets visually behind the
    // node from being hit.  This is the default.
    //
    // Opaque targets are useful for UI elements like buttons which cover and
    // block interaction with content visually behind them.
    OPAQUE,

    // The node can be hit and allows other targets visually behind the node
    // to also be hit.
    //
    // Translucent targets are useful for UI elements like dimissed drawers
    // which may not obscure content visually behind them but which do need
    // to intercept gestures in that area (perhaps to reveal themselves).
    TRANSLUCENT,

    // The node cannot be hit.
    //
    // Invisible targets are useful for explicitly suppressing hit testing
    // for a node and its children when combined with the |prune| flag.
    INVISIBLE,
  };

  // Specifies the visibility of the node for hit testing purposes.
  // The default is opaque.
  Visibility visibility = Visibility.OPAQUE;

  // When set to true, prevents a node's children or reference scenes from
  // being hit tested.
  bool prune = false;

  // The rectangle within the node's content space to test for hits.
  // If null, the node's entire clip region is tested for hits.
  //
  // TODO(jeffbrown): Support more complex hit test regions and masks.
  mojo.RectF? hit_rect;
};

// A hit testing service for scene graphs.
interface HitTester {
  // Performs a hit test on the specified point.
  //
  // TODO(jeffbrown): Specify a presentation timestamp to allow for
  // hit-tests of geometry as it appeared to the user in the recent past.
  HitTest(mojo.PointF point) => (HitTestResult result);
};

// The result of a hit test operation.
//
// Hit test results form a hit tree with information about the nodes which
// were hit and the scenes which contain them.  The structure of the hit
// tree reflects the path that the scene graph was traversed during the
// hit test.
//
// To walk the hit nodes in dispatch order, perform a post-order traversal
// of the hit tree starting at |root| and processing children before their
// parents.
struct HitTestResult {
  // A tree of hits beginning at the root scene, or null if nothing was hit.
  SceneHit? root;
};

// An element in a hit tree.
// This either contains a reference to another scene which contains hits or
// to a specific node within the containing scene which was hit.
union Hit {
  SceneHit scene;
  NodeHit node;
};

// Describes a collection of hits within a scene.
struct SceneHit {
  // The scene token of the scene which contains hits.
  SceneToken scene_token;

  // The version of the scene which was consulted at the time the hit test
  // was performed.
  uint32 scene_version;

  // The array of hits within this scene, in dispatch order.
  // This list always contains at least one entry.
  array<Hit> hits;
};

// Describes the intersection of a hit test with a node.
struct NodeHit {
  // The node id of the node which was hit.
  uint32 node_id;

  // The transformation from the global coordinate system of the scene graph
  // to the local coordinate system of the node's content space at the time
  // the hit test was performed.
  //
  // To obtain the point of intersection of the hit test within the node's
  // content space, multiply this transformation matrix by the hit test point.
  mojo.Transform transform;
};
