Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(637)

Side by Side Diff: cc/trees/layer_tree_host_common.cc

Issue 139233002: [#4] Pass gfx structs by const ref (gfx::PointF) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Corrected as per review comments! Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/layer_tree_host_common.h" 5 #include "cc/trees/layer_tree_host_common.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "cc/base/math_util.h" 10 #include "cc/base/math_util.h"
(...skipping 2227 matching lines...) Expand 10 before | Expand all | Expand 10 after
2238 &accumulated_surface_state); 2238 &accumulated_surface_state);
2239 2239
2240 // The dummy layer list should not have been used. 2240 // The dummy layer list should not have been used.
2241 DCHECK_EQ(0u, dummy_layer_list.size()); 2241 DCHECK_EQ(0u, dummy_layer_list.size());
2242 // A root layer render_surface should always exist after 2242 // A root layer render_surface should always exist after
2243 // CalculateDrawProperties. 2243 // CalculateDrawProperties.
2244 DCHECK(inputs->root_layer->render_surface()); 2244 DCHECK(inputs->root_layer->render_surface());
2245 } 2245 }
2246 2246
2247 static bool PointHitsRect( 2247 static bool PointHitsRect(
2248 gfx::PointF screen_space_point, 2248 const gfx::PointF& screen_space_point,
2249 const gfx::Transform& local_space_to_screen_space_transform, 2249 const gfx::Transform& local_space_to_screen_space_transform,
2250 const gfx::RectF& local_space_rect) { 2250 const gfx::RectF& local_space_rect) {
2251 // If the transform is not invertible, then assume that this point doesn't hit 2251 // If the transform is not invertible, then assume that this point doesn't hit
2252 // this rect. 2252 // this rect.
2253 gfx::Transform inverse_local_space_to_screen_space( 2253 gfx::Transform inverse_local_space_to_screen_space(
2254 gfx::Transform::kSkipInitialization); 2254 gfx::Transform::kSkipInitialization);
2255 if (!local_space_to_screen_space_transform.GetInverse( 2255 if (!local_space_to_screen_space_transform.GetInverse(
2256 &inverse_local_space_to_screen_space)) 2256 &inverse_local_space_to_screen_space))
2257 return false; 2257 return false;
2258 2258
2259 // Transform the hit test point from screen space to the local space of the 2259 // Transform the hit test point from screen space to the local space of the
2260 // given rect. 2260 // given rect.
2261 bool clipped = false; 2261 bool clipped = false;
2262 gfx::PointF hit_test_point_in_local_space = MathUtil::ProjectPoint( 2262 gfx::PointF hit_test_point_in_local_space = MathUtil::ProjectPoint(
2263 inverse_local_space_to_screen_space, screen_space_point, &clipped); 2263 inverse_local_space_to_screen_space, screen_space_point, &clipped);
2264 2264
2265 // If ProjectPoint could not project to a valid value, then we assume that 2265 // If ProjectPoint could not project to a valid value, then we assume that
2266 // this point doesn't hit this rect. 2266 // this point doesn't hit this rect.
2267 if (clipped) 2267 if (clipped)
2268 return false; 2268 return false;
2269 2269
2270 return local_space_rect.Contains(hit_test_point_in_local_space); 2270 return local_space_rect.Contains(hit_test_point_in_local_space);
2271 } 2271 }
2272 2272
2273 static bool PointHitsRegion(gfx::PointF screen_space_point, 2273 static bool PointHitsRegion(const gfx::PointF& screen_space_point,
2274 const gfx::Transform& screen_space_transform, 2274 const gfx::Transform& screen_space_transform,
2275 const Region& layer_space_region, 2275 const Region& layer_space_region,
2276 float layer_content_scale_x, 2276 float layer_content_scale_x,
2277 float layer_content_scale_y) { 2277 float layer_content_scale_y) {
2278 // If the transform is not invertible, then assume that this point doesn't hit 2278 // If the transform is not invertible, then assume that this point doesn't hit
2279 // this region. 2279 // this region.
2280 gfx::Transform inverse_screen_space_transform( 2280 gfx::Transform inverse_screen_space_transform(
2281 gfx::Transform::kSkipInitialization); 2281 gfx::Transform::kSkipInitialization);
2282 if (!screen_space_transform.GetInverse(&inverse_screen_space_transform)) 2282 if (!screen_space_transform.GetInverse(&inverse_screen_space_transform))
2283 return false; 2283 return false;
(...skipping 10 matching lines...) Expand all
2294 2294
2295 // If ProjectPoint could not project to a valid value, then we assume that 2295 // If ProjectPoint could not project to a valid value, then we assume that
2296 // this point doesn't hit this region. 2296 // this point doesn't hit this region.
2297 if (clipped) 2297 if (clipped)
2298 return false; 2298 return false;
2299 2299
2300 return layer_space_region.Contains( 2300 return layer_space_region.Contains(
2301 gfx::ToRoundedPoint(hit_test_point_in_layer_space)); 2301 gfx::ToRoundedPoint(hit_test_point_in_layer_space));
2302 } 2302 }
2303 2303
2304 static bool PointIsClippedBySurfaceOrClipRect(gfx::PointF screen_space_point, 2304 static bool PointIsClippedBySurfaceOrClipRect(
2305 LayerImpl* layer) { 2305 const gfx::PointF& screen_space_point,
2306 LayerImpl* layer) {
2306 LayerImpl* current_layer = layer; 2307 LayerImpl* current_layer = layer;
2307 2308
2308 // Walk up the layer tree and hit-test any render_surfaces and any layer 2309 // Walk up the layer tree and hit-test any render_surfaces and any layer
2309 // clip rects that are active. 2310 // clip rects that are active.
2310 while (current_layer) { 2311 while (current_layer) {
2311 if (current_layer->render_surface() && 2312 if (current_layer->render_surface() &&
2312 !PointHitsRect( 2313 !PointHitsRect(
2313 screen_space_point, 2314 screen_space_point,
2314 current_layer->render_surface()->screen_space_transform(), 2315 current_layer->render_surface()->screen_space_transform(),
2315 current_layer->render_surface()->content_rect())) 2316 current_layer->render_surface()->content_rect()))
(...skipping 12 matching lines...) Expand all
2328 2329
2329 current_layer = current_layer->parent(); 2330 current_layer = current_layer->parent();
2330 } 2331 }
2331 2332
2332 // If we have finished walking all ancestors without having already exited, 2333 // If we have finished walking all ancestors without having already exited,
2333 // then the point is not clipped by any ancestors. 2334 // then the point is not clipped by any ancestors.
2334 return false; 2335 return false;
2335 } 2336 }
2336 2337
2337 LayerImpl* LayerTreeHostCommon::FindLayerThatIsHitByPoint( 2338 LayerImpl* LayerTreeHostCommon::FindLayerThatIsHitByPoint(
2338 gfx::PointF screen_space_point, 2339 const gfx::PointF& screen_space_point,
2339 const LayerImplList& render_surface_layer_list) { 2340 const LayerImplList& render_surface_layer_list) {
2340 LayerImpl* found_layer = NULL; 2341 LayerImpl* found_layer = NULL;
2341 2342
2342 typedef LayerIterator<LayerImpl, 2343 typedef LayerIterator<LayerImpl,
2343 LayerImplList, 2344 LayerImplList,
2344 RenderSurfaceImpl, 2345 RenderSurfaceImpl,
2345 LayerIteratorActions::FrontToBack> LayerIteratorType; 2346 LayerIteratorActions::FrontToBack> LayerIteratorType;
2346 LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list); 2347 LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list);
2347 2348
2348 for (LayerIteratorType 2349 for (LayerIteratorType
(...skipping 25 matching lines...) Expand all
2374 found_layer = current_layer; 2375 found_layer = current_layer;
2375 break; 2376 break;
2376 } 2377 }
2377 2378
2378 // This can potentially return NULL, which means the screen_space_point did 2379 // This can potentially return NULL, which means the screen_space_point did
2379 // not successfully hit test any layers, not even the root layer. 2380 // not successfully hit test any layers, not even the root layer.
2380 return found_layer; 2381 return found_layer;
2381 } 2382 }
2382 2383
2383 LayerImpl* LayerTreeHostCommon::FindLayerThatIsHitByPointInTouchHandlerRegion( 2384 LayerImpl* LayerTreeHostCommon::FindLayerThatIsHitByPointInTouchHandlerRegion(
2384 gfx::PointF screen_space_point, 2385 const gfx::PointF& screen_space_point,
2385 const LayerImplList& render_surface_layer_list) { 2386 const LayerImplList& render_surface_layer_list) {
2386 // First find out which layer was hit from the saved list of visible layers 2387 // First find out which layer was hit from the saved list of visible layers
2387 // in the most recent frame. 2388 // in the most recent frame.
2388 LayerImpl* layer_impl = LayerTreeHostCommon::FindLayerThatIsHitByPoint( 2389 LayerImpl* layer_impl = LayerTreeHostCommon::FindLayerThatIsHitByPoint(
2389 screen_space_point, 2390 screen_space_point,
2390 render_surface_layer_list); 2391 render_surface_layer_list);
2391 2392
2392 // Walk up the hierarchy and look for a layer with a touch event handler 2393 // Walk up the hierarchy and look for a layer with a touch event handler
2393 // region that the given point hits. 2394 // region that the given point hits.
2394 // This walk may not be necessary anymore: http://crbug.com/310817 2395 // This walk may not be necessary anymore: http://crbug.com/310817
2395 for (; layer_impl; layer_impl = layer_impl->parent()) { 2396 for (; layer_impl; layer_impl = layer_impl->parent()) {
2396 if (LayerTreeHostCommon::LayerHasTouchEventHandlersAt(screen_space_point, 2397 if (LayerTreeHostCommon::LayerHasTouchEventHandlersAt(screen_space_point,
2397 layer_impl)) 2398 layer_impl))
2398 break; 2399 break;
2399 } 2400 }
2400 return layer_impl; 2401 return layer_impl;
2401 } 2402 }
2402 2403
2403 bool LayerTreeHostCommon::LayerHasTouchEventHandlersAt( 2404 bool LayerTreeHostCommon::LayerHasTouchEventHandlersAt(
2404 gfx::PointF screen_space_point, 2405 const gfx::PointF& screen_space_point,
2405 LayerImpl* layer_impl) { 2406 LayerImpl* layer_impl) {
2406 if (layer_impl->touch_event_handler_region().IsEmpty()) 2407 if (layer_impl->touch_event_handler_region().IsEmpty())
2407 return false; 2408 return false;
2408 2409
2409 if (!PointHitsRegion(screen_space_point, 2410 if (!PointHitsRegion(screen_space_point,
2410 layer_impl->screen_space_transform(), 2411 layer_impl->screen_space_transform(),
2411 layer_impl->touch_event_handler_region(), 2412 layer_impl->touch_event_handler_region(),
2412 layer_impl->contents_scale_x(), 2413 layer_impl->contents_scale_x(),
2413 layer_impl->contents_scale_y())) 2414 layer_impl->contents_scale_y()))
2414 return false; 2415 return false;
2415 2416
2416 // At this point, we think the point does hit the touch event handler region 2417 // At this point, we think the point does hit the touch event handler region
2417 // on the layer, but we need to walk up the parents to ensure that the layer 2418 // on the layer, but we need to walk up the parents to ensure that the layer
2418 // was not clipped in such a way that the hit point actually should not hit 2419 // was not clipped in such a way that the hit point actually should not hit
2419 // the layer. 2420 // the layer.
2420 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) 2421 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl))
2421 return false; 2422 return false;
2422 2423
2423 return true; 2424 return true;
2424 } 2425 }
2425 } // namespace cc 2426 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698