// 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 #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* 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* 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_