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

#ifndef CC_SURFACES_SURFACE_HITTEST_H_
#define CC_SURFACES_SURFACE_HITTEST_H_

#include <set>

#include "cc/surfaces/surface_id.h"
#include "cc/surfaces/surfaces_export.h"

namespace gfx {
class Point;
class Transform;
}

namespace cc {

class DrawQuad;
class RenderPass;
class SurfaceHittestDelegate;
class SurfaceManager;

// Performs a hittest in surface quads.
class CC_SURFACES_EXPORT SurfaceHittest {
 public:
  SurfaceHittest(SurfaceHittestDelegate* delegate, SurfaceManager* manager);
  ~SurfaceHittest();

  // Returns the target surface that falls underneath the provided |point|.
  // Also returns the |transform| to convert the |point| to the target surface's
  // space.
  SurfaceId GetTargetSurfaceAtPoint(const SurfaceId& root_surface_id,
                                    const gfx::Point& point,
                                    gfx::Transform* transform);

  // Returns whether the target surface falls inside the provide root surface.
  // Returns the |transform| to convert points from the root surface coordinate
  // space to the target surface coordinate space.
  bool GetTransformToTargetSurface(const SurfaceId& root_surface_id,
                                   const SurfaceId& target_surface_id,
                                   gfx::Transform* transform);

  // Attempts to transform a point from the coordinate space of one surface to
  // that of another, where one is surface is embedded within the other.
  // Returns true if the transform is successfully applied, and false if
  // neither surface is contained with the other.
  bool TransformPointToTargetSurface(const SurfaceId& original_surface_id,
                                     const SurfaceId& target_surface_id,
                                     gfx::Point* point);

 private:
  bool GetTargetSurfaceAtPointInternal(
      const SurfaceId& surface_id,
      int render_pass_id,
      const gfx::Point& point_in_root_target,
      std::set<const RenderPass*>* referenced_passes,
      SurfaceId* out_surface_id,
      gfx::Transform* out_transform);

  bool GetTransformToTargetSurfaceInternal(
      const SurfaceId& root_surface_id,
      const SurfaceId& target_surface_id,
      int render_pass_id,
      std::set<const RenderPass*>* referenced_passes,
      gfx::Transform* out_transform);

  const RenderPass* GetRenderPassForSurfaceById(const SurfaceId& surface_id,
                                                int render_pass_id);

  bool PointInQuad(const DrawQuad* quad,
                   const gfx::Point& point_in_render_pass_space,
                   gfx::Transform* target_to_quad_transform,
                   gfx::Point* point_in_quad_space);

  SurfaceHittestDelegate* const delegate_;
  SurfaceManager* const manager_;
};
}  // namespace cc

#endif  // CC_SURFACES_SURFACE_HITTEST_H_
