12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/debug_rect_history.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/damage_tracker.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/trees/layer_tree_host_common.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DebugRectHistory> DebugRectHistory::Create() { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new DebugRectHistory()); 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory::DebugRectHistory() {} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory::~DebugRectHistory() {} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveDebugRectsForCurrentFrame( 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_layer, 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& occluding_screen_space_rects, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& non_occluding_screen_space_rects, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeDebugState& debug_state) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For now, clear all rects from previous frames. In the future we may want to 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // store all debug rects for a history of many frames. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.clear(); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (debug_state.show_touch_event_handler_rects) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveTouchEventHandlerRects(root_layer); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (debug_state.show_wheel_event_handler_rects) 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveWheelEventHandlerRects(root_layer); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (debug_state.show_non_fast_scrollable_rects) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveNonFastScrollableRects(root_layer); 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_paint_rects) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SavePaintRects(root_layer); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_property_changed_rects) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SavePropertyChangedRects(render_surface_layer_list); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_surface_damage_rects) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveSurfaceDamageRects(render_surface_layer_list); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_screen_space_rects) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveScreenSpaceRects(render_surface_layer_list); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_occluding_rects) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveOccludingRects(occluding_screen_space_rects); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_non_occluding_rects) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveNonOccludingRects(non_occluding_screen_space_rects); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SavePaintRects(LayerImpl* layer) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We would like to visualize where any layer's paint rect (update rect) has 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed, regardless of whether this layer is skipped for actual drawing or 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not. Therefore we traverse recursively over all layers, not just the render 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface list. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer->update_rect().IsEmpty() && layer->DrawsContent()) { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float width_scale = layer->content_bounds().width() / 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<float>(layer->bounds().width()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float height_scale = layer->content_bounds().height() / 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<float>(layer->bounds().height()); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF update_content_rect = 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScaleRect(layer->update_rect(), width_scale, height_scale); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(PAINT_RECT_TYPE, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect(layer->screen_space_transform(), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update_content_rect))); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned i = 0; i < layer->children().size(); ++i) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SavePaintRects(layer->children()[i]); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SavePropertyChangedRects( 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_index >= 0; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& layer_list = render_surface->layer_list(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned layer_index = 0; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_index < layer_list.size(); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++layer_index) { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer = layer_list[layer_index]; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (LayerTreeHostCommon::RenderSurfaceContributesToTarget<LayerImpl>( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer, render_surface_layer->id())) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->LayerIsAlwaysDamaged()) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer->LayerPropertyChanged() || 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->LayerSurfacePropertyChanged()) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(PROPERTY_CHANGED_RECT_TYPE, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect( 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->screen_space_transform(), 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF(gfx::PointF(), layer->content_bounds())))); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveSurfaceDamageRects( 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_index >= 0; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back(DebugRect( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SURFACE_DAMAGE_RECT_TYPE, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect( 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->screen_space_transform(), 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->damage_tracker()->current_damage_rect()))); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveScreenSpaceRects( 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_index >= 0; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back(DebugRect( 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SCREEN_SPACE_RECT_TYPE, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect(render_surface->screen_space_transform(), 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->content_rect()))); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_surface_layer->replica_layer()) { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(REPLICA_SCREEN_SPACE_RECT_TYPE, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->replica_screen_space_transform(), 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->content_rect()))); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveOccludingRects( 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& occluding_rects) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < occluding_rects.size(); ++i) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back(DebugRect(OCCLUDING_RECT_TYPE, occluding_rects[i])); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveNonOccludingRects( 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& non_occluding_rects) { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < non_occluding_rects.size(); ++i) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(NONOCCLUDING_RECT_TYPE, non_occluding_rects[i])); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveTouchEventHandlerRects(LayerImpl* layer) { 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer, 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&DebugRectHistory::SaveTouchEventHandlerRectsCallback, 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveTouchEventHandlerRectsCallback(LayerImpl* layer) { 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (Region::Iterator iter(layer->touch_event_handler_region()); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.has_rect(); 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.next()) { 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::RectF touch_rect = gfx::ScaleRect(iter.rect(), 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->contents_scale_x(), 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->contents_scale_y()); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch debug_rects_.push_back(DebugRect(TOUCH_EVENT_HANDLER_RECT_TYPE, 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MathUtil::MapClippedRect( 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->screen_space_transform(), 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch touch_rect))); 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveWheelEventHandlerRects(LayerImpl* layer) { 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer, 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&DebugRectHistory::SaveWheelEventHandlerRectsCallback, 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveWheelEventHandlerRectsCallback(LayerImpl* layer) { 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!layer->have_wheel_event_handlers()) 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::RectF wheel_rect = gfx::RectF(layer->content_bounds()); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wheel_rect.Scale(layer->contents_scale_x(), layer->contents_scale_y()); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch debug_rects_.push_back(DebugRect(WHEEL_EVENT_HANDLER_RECT_TYPE, 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MathUtil::MapClippedRect( 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->screen_space_transform(), 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wheel_rect))); 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveNonFastScrollableRects(LayerImpl* layer) { 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer, 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&DebugRectHistory::SaveNonFastScrollableRectsCallback, 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveNonFastScrollableRectsCallback(LayerImpl* layer) { 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (Region::Iterator iter(layer->non_fast_scrollable_region()); 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.has_rect(); 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.next()) { 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::RectF scroll_rect = gfx::ScaleRect(iter.rect(), 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->contents_scale_x(), 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->contents_scale_y()); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch debug_rects_.push_back(DebugRect(NON_FAST_SCROLLABLE_RECT_TYPE, 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MathUtil::MapClippedRect( 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->screen_space_transform(), 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scroll_rect))); 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 237