Index: cc/trees/layer_tree_impl.cc |
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc |
index 41f36ec98f3c5d34b2b0192851f7da7d37fe12db..3d47155531291e7852427bae2405ba97c6ebd2d3 100644 |
--- a/cc/trees/layer_tree_impl.cc |
+++ b/cc/trees/layer_tree_impl.cc |
@@ -1678,20 +1678,21 @@ static bool PointHitsRegion(const gfx::PointF& screen_space_point, |
} |
static const gfx::Transform SurfaceScreenSpaceTransform( |
- const LayerImpl* layer, |
- const TransformTree& transform_tree) { |
+ const LayerImpl* layer) { |
+ const PropertyTrees* property_trees = |
+ layer->layer_tree_impl()->property_trees(); |
DCHECK(layer->render_surface()); |
return layer->is_drawn_render_surface_layer_list_member() |
? layer->render_surface()->screen_space_transform() |
- : transform_tree.ToScreenSpaceTransformWithoutSurfaceContentsScale( |
- layer->render_surface()->TransformTreeIndex()); |
+ : property_trees |
+ ->ToScreenSpaceTransformWithoutSurfaceContentsScale( |
+ layer->render_surface()->TransformTreeIndex(), |
+ layer->render_surface()->EffectTreeIndex()); |
} |
static bool PointIsClippedByAncestorClipNode( |
const gfx::PointF& screen_space_point, |
- const LayerImpl* layer, |
- const ClipTree& clip_tree, |
- const TransformTree& transform_tree) { |
+ const LayerImpl* layer) { |
// We need to visit all ancestor clip nodes to check this. Checking with just |
// the combined clip stored at a clip node is not enough because parent |
// combined clip can sometimes be smaller than current combined clip. This can |
@@ -1700,6 +1701,10 @@ static bool PointIsClippedByAncestorClipNode( |
// ancestor render surface. |
// We first check if the point is clipped by viewport. |
+ const PropertyTrees* property_trees = |
+ layer->layer_tree_impl()->property_trees(); |
+ const ClipTree& clip_tree = property_trees->clip_tree; |
+ const TransformTree& transform_tree = property_trees->transform_tree; |
const ClipNode* clip_node = clip_tree.Node(1); |
gfx::Rect combined_clip_in_target_space = |
gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); |
@@ -1724,7 +1729,7 @@ static bool PointIsClippedByAncestorClipNode( |
(layer->layer_tree_impl() |
->is_in_resourceless_software_draw_mode()) |
? gfx::Transform() |
- : SurfaceScreenSpaceTransform(target_layer, transform_tree); |
+ : SurfaceScreenSpaceTransform(target_layer); |
if (!PointHitsRect(screen_space_point, surface_screen_space_transform, |
combined_clip_in_target_space, NULL)) { |
return true; |
@@ -1734,8 +1739,7 @@ static bool PointIsClippedByAncestorClipNode( |
layer->layer_tree_impl()->LayerById(clip_node->owner_id); |
if (clip_node_owner->render_surface() && |
!PointHitsRect( |
- screen_space_point, |
- SurfaceScreenSpaceTransform(clip_node_owner, transform_tree), |
+ screen_space_point, SurfaceScreenSpaceTransform(clip_node_owner), |
clip_node_owner->render_surface()->content_rect(), NULL)) { |
return true; |
} |
@@ -1745,20 +1749,15 @@ static bool PointIsClippedByAncestorClipNode( |
static bool PointIsClippedBySurfaceOrClipRect( |
const gfx::PointF& screen_space_point, |
- const LayerImpl* layer, |
- const TransformTree& transform_tree, |
- const ClipTree& clip_tree) { |
+ const LayerImpl* layer) { |
// Walk up the layer tree and hit-test any render_surfaces and any layer |
// clip rects that are active. |
- return PointIsClippedByAncestorClipNode(screen_space_point, layer, clip_tree, |
- transform_tree); |
+ return PointIsClippedByAncestorClipNode(screen_space_point, layer); |
} |
static bool PointHitsLayer(const LayerImpl* layer, |
const gfx::PointF& screen_space_point, |
- float* distance_to_intersection, |
- const TransformTree& transform_tree, |
- const ClipTree& clip_tree) { |
+ float* distance_to_intersection) { |
gfx::Rect content_rect(layer->bounds()); |
if (!PointHitsRect(screen_space_point, layer->ScreenSpaceTransform(), |
content_rect, distance_to_intersection)) { |
@@ -1768,8 +1767,7 @@ static bool PointHitsLayer(const LayerImpl* layer, |
// At this point, we think the point does hit the layer, but we need to walk |
// up the parents to ensure that the layer was not clipped in such a way |
// that the hit point actually should not hit the layer. |
- if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer, |
- transform_tree, clip_tree)) |
+ if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer)) |
return false; |
// Skip the HUD layer. |
@@ -1793,8 +1791,6 @@ template <typename Functor> |
static void FindClosestMatchingLayer(const gfx::PointF& screen_space_point, |
LayerImpl* root_layer, |
const Functor& func, |
- const TransformTree& transform_tree, |
- const ClipTree& clip_tree, |
FindClosestMatchingLayerState* state) { |
// We want to iterate from front to back when hit testing. |
for (auto* layer : base::Reversed(*root_layer->layer_tree_impl())) { |
@@ -1804,11 +1800,10 @@ static void FindClosestMatchingLayer(const gfx::PointF& screen_space_point, |
float distance_to_intersection = 0.f; |
bool hit = false; |
if (layer->Is3dSorted()) |
- hit = PointHitsLayer(layer, screen_space_point, &distance_to_intersection, |
- transform_tree, clip_tree); |
+ hit = |
+ PointHitsLayer(layer, screen_space_point, &distance_to_intersection); |
else |
- hit = PointHitsLayer(layer, screen_space_point, nullptr, transform_tree, |
- clip_tree); |
+ hit = PointHitsLayer(layer, screen_space_point, nullptr); |
if (!hit) |
continue; |
@@ -1846,9 +1841,7 @@ LayerTreeImpl::FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint( |
FindClosestMatchingLayerState state; |
LayerImpl* root_layer = layer_list_.empty() ? nullptr : layer_list_[0]; |
FindClosestMatchingLayer(screen_space_point, root_layer, |
- FindScrollingLayerOrScrollbarLayerFunctor(), |
- property_trees_.transform_tree, |
- property_trees_.clip_tree, &state); |
+ FindScrollingLayerOrScrollbarLayerFunctor(), &state); |
return state.closest_match; |
} |
@@ -1870,15 +1863,12 @@ LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPoint( |
FindClosestMatchingLayerState state; |
FindClosestMatchingLayer(screen_space_point, layer_list_[0], |
HitTestVisibleScrollableOrTouchableFunctor(), |
- property_trees_.transform_tree, |
- property_trees_.clip_tree, &state); |
+ &state); |
return state.closest_match; |
} |
static bool LayerHasTouchEventHandlersAt(const gfx::PointF& screen_space_point, |
- LayerImpl* layer_impl, |
- const TransformTree& transform_tree, |
- const ClipTree& clip_tree) { |
+ LayerImpl* layer_impl) { |
if (layer_impl->touch_event_handler_region().IsEmpty()) |
return false; |
@@ -1890,8 +1880,7 @@ static bool LayerHasTouchEventHandlersAt(const gfx::PointF& screen_space_point, |
// on the layer, but we need to walk up the parents to ensure that the layer |
// was not clipped in such a way that the hit point actually should not hit |
// the layer. |
- if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl, |
- transform_tree, clip_tree)) |
+ if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) |
return false; |
return true; |
@@ -1899,12 +1888,9 @@ static bool LayerHasTouchEventHandlersAt(const gfx::PointF& screen_space_point, |
struct FindTouchEventLayerFunctor { |
bool operator()(LayerImpl* layer) const { |
- return LayerHasTouchEventHandlersAt(screen_space_point, layer, |
- transform_tree, clip_tree); |
+ return LayerHasTouchEventHandlersAt(screen_space_point, layer); |
} |
const gfx::PointF screen_space_point; |
- const TransformTree& transform_tree; |
- const ClipTree& clip_tree; |
}; |
LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion( |
@@ -1914,13 +1900,9 @@ LayerImpl* LayerTreeImpl::FindLayerThatIsHitByPointInTouchHandlerRegion( |
bool update_lcd_text = false; |
if (!UpdateDrawProperties(update_lcd_text)) |
return NULL; |
- FindTouchEventLayerFunctor func = {screen_space_point, |
- property_trees_.transform_tree, |
- property_trees_.clip_tree}; |
+ FindTouchEventLayerFunctor func = {screen_space_point}; |
FindClosestMatchingLayerState state; |
- FindClosestMatchingLayer(screen_space_point, layer_list_[0], func, |
- property_trees_.transform_tree, |
- property_trees_.clip_tree, &state); |
+ FindClosestMatchingLayer(screen_space_point, layer_list_[0], func, &state); |
return state.closest_match; |
} |
@@ -1931,9 +1913,7 @@ void LayerTreeImpl::RegisterSelection(const LayerSelection& selection) { |
static gfx::SelectionBound ComputeViewportSelectionBound( |
const LayerSelectionBound& layer_bound, |
LayerImpl* layer, |
- float device_scale_factor, |
- const TransformTree& transform_tree, |
- const ClipTree& clip_tree) { |
+ float device_scale_factor) { |
gfx::SelectionBound viewport_bound; |
viewport_bound.set_type(layer_bound.type); |
@@ -1976,8 +1956,8 @@ static gfx::SelectionBound ComputeViewportSelectionBound( |
MathUtil::MapPoint(screen_space_transform, visibility_point, &clipped); |
float intersect_distance = 0.f; |
- viewport_bound.set_visible(PointHitsLayer( |
- layer, visibility_point, &intersect_distance, transform_tree, clip_tree)); |
+ viewport_bound.set_visible( |
+ PointHitsLayer(layer, visibility_point, &intersect_distance)); |
return viewport_bound; |
} |
@@ -1989,8 +1969,7 @@ void LayerTreeImpl::GetViewportSelection( |
selection->start = ComputeViewportSelectionBound( |
selection_.start, |
selection_.start.layer_id ? LayerById(selection_.start.layer_id) : NULL, |
- device_scale_factor(), property_trees_.transform_tree, |
- property_trees_.clip_tree); |
+ device_scale_factor()); |
selection->is_editable = selection_.is_editable; |
selection->is_empty_text_form_control = selection_.is_empty_text_form_control; |
if (selection->start.type() == gfx::SelectionBound::CENTER || |
@@ -2000,8 +1979,7 @@ void LayerTreeImpl::GetViewportSelection( |
selection->end = ComputeViewportSelectionBound( |
selection_.end, |
selection_.end.layer_id ? LayerById(selection_.end.layer_id) : NULL, |
- device_scale_factor(), property_trees_.transform_tree, |
- property_trees_.clip_tree); |
+ device_scale_factor()); |
} |
} |