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" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "cc/layers/layer_iterator.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/layers/layer_utils.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/damage_tracker.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/trees/layer_tree_host_common.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/gfx/geometry/rect_conversions.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DebugRectHistory> DebugRectHistory::Create() { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new DebugRectHistory()); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory::DebugRectHistory() {} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DebugRectHistory::~DebugRectHistory() {} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveDebugRectsForCurrentFrame( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_layer, 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* hud_layer, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& occluding_screen_space_rects, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& non_occluding_screen_space_rects, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeDebugState& debug_state) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For now, clear all rects from previous frames. In the future we may want to 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // store all debug rects for a history of many frames. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.clear(); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (debug_state.show_touch_event_handler_rects) 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveTouchEventHandlerRects(root_layer); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (debug_state.show_wheel_event_handler_rects) 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveWheelEventHandlerRects(root_layer); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (debug_state.show_scroll_event_handler_rects) 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SaveScrollEventHandlerRects(root_layer); 47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (debug_state.show_non_fast_scrollable_rects) 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveNonFastScrollableRects(root_layer); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_paint_rects) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SavePaintRects(root_layer); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_property_changed_rects) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SavePropertyChangedRects(render_surface_layer_list, hud_layer); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_surface_damage_rects) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveSurfaceDamageRects(render_surface_layer_list); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_screen_space_rects) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveScreenSpaceRects(render_surface_layer_list); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_occluding_rects) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveOccludingRects(occluding_screen_space_rects); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (debug_state.show_non_occluding_rects) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SaveNonOccludingRects(non_occluding_screen_space_rects); 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (debug_state.show_layer_animation_bounds_rects) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SaveLayerAnimationBoundsRects(render_surface_layer_list); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SavePaintRects(LayerImpl* layer) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We would like to visualize where any layer's paint rect (update rect) has 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed, regardless of whether this layer is skipped for actual drawing or 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not. Therefore we traverse recursively over all layers, not just the render 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface list. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer->update_rect().IsEmpty() && layer->DrawsContent()) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float width_scale = layer->content_bounds().width() / 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<float>(layer->bounds().width()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float height_scale = layer->content_bounds().height() / 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<float>(layer->bounds().height()); 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect update_content_rect = gfx::ScaleToEnclosingRect( 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::ToEnclosingRect(layer->update_rect()), width_scale, height_scale); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(PAINT_RECT_TYPE, 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->screen_space_transform(), update_content_rect))); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned i = 0; i < layer->children().size(); ++i) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SavePaintRects(layer->children()[i]); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SavePropertyChangedRects( 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const LayerImplList& render_surface_layer_list, 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* hud_layer) { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_index >= 0; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& layer_list = render_surface->layer_list(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned layer_index = 0; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_index < layer_list.size(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++layer_index) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer = layer_list[layer_index]; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (LayerTreeHostCommon::RenderSurfaceContributesToTarget<LayerImpl>( 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer, render_surface_layer->id())) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (layer == hud_layer) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!layer->LayerPropertyChanged()) 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch continue; 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(PROPERTY_CHANGED_RECT_TYPE, 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->screen_space_transform(), 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect(layer->content_bounds())))); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveSurfaceDamageRects( 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_index >= 0; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back(DebugRect( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SURFACE_DAMAGE_RECT_TYPE, 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->screen_space_transform(), 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->damage_tracker()->current_damage_rect()))); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveScreenSpaceRects( 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& render_surface_layer_list) { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int surface_index = render_surface_layer_list.size() - 1; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_index >= 0; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --surface_index) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* render_surface_layer = render_surface_layer_list[surface_index]; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(render_surface); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(SCREEN_SPACE_RECT_TYPE, 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_surface->screen_space_transform(), 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_surface->content_rect()))); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_surface_layer->replica_layer()) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(REPLICA_SCREEN_SPACE_RECT_TYPE, 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->replica_screen_space_transform(), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_surface->content_rect()))); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveOccludingRects( 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& occluding_rects) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < occluding_rects.size(); ++i) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back(DebugRect(OCCLUDING_RECT_TYPE, occluding_rects[i])); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DebugRectHistory::SaveNonOccludingRects( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<gfx::Rect>& non_occluding_rects) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < non_occluding_rects.size(); ++i) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_rects_.push_back( 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugRect(NONOCCLUDING_RECT_TYPE, non_occluding_rects[i])); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveTouchEventHandlerRects(LayerImpl* layer) { 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer, 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&DebugRectHistory::SaveTouchEventHandlerRectsCallback, 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveTouchEventHandlerRectsCallback(LayerImpl* layer) { 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (Region::Iterator iter(layer->touch_event_handler_region()); 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.has_rect(); 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.next()) { 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect touch_rect = gfx::ScaleToEnclosingRect( 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch iter.rect(), layer->contents_scale_x(), layer->contents_scale_y()); 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(TOUCH_EVENT_HANDLER_RECT_TYPE, 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->screen_space_transform(), touch_rect))); 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveWheelEventHandlerRects(LayerImpl* layer) { 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer, 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&DebugRectHistory::SaveWheelEventHandlerRectsCallback, 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveWheelEventHandlerRectsCallback(LayerImpl* layer) { 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!layer->have_wheel_event_handlers()) 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect wheel_rect = 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::ScaleToEnclosingRect(gfx::Rect(layer->content_bounds()), 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->contents_scale_x(), 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->contents_scale_y()); 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(WHEEL_EVENT_HANDLER_RECT_TYPE, 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->screen_space_transform(), wheel_rect))); 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 228e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid DebugRectHistory::SaveScrollEventHandlerRects(LayerImpl* layer) { 229e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 230e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch layer, 231e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Bind(&DebugRectHistory::SaveScrollEventHandlerRectsCallback, 232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Unretained(this))); 233e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 234e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 235e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid DebugRectHistory::SaveScrollEventHandlerRectsCallback(LayerImpl* layer) { 236e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!layer->have_scroll_event_handlers()) 237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect scroll_rect = 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::ScaleToEnclosingRect(gfx::Rect(layer->content_bounds()), 241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->contents_scale_x(), 242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->contents_scale_y()); 243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(SCROLL_EVENT_HANDLER_RECT_TYPE, 245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->screen_space_transform(), scroll_rect))); 247e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 248e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveNonFastScrollableRects(LayerImpl* layer) { 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>( 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer, 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&DebugRectHistory::SaveNonFastScrollableRectsCallback, 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DebugRectHistory::SaveNonFastScrollableRectsCallback(LayerImpl* layer) { 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (Region::Iterator iter(layer->non_fast_scrollable_region()); 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.has_rect(); 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.next()) { 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect scroll_rect = gfx::ScaleToEnclosingRect( 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch iter.rect(), layer->contents_scale_x(), layer->contents_scale_y()); 262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(NON_FAST_SCROLLABLE_RECT_TYPE, 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MathUtil::MapEnclosingClippedRect( 265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch layer->screen_space_transform(), scroll_rect))); 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void DebugRectHistory::SaveLayerAnimationBoundsRects( 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const LayerImplList& render_surface_layer_list) { 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef LayerIterator<LayerImpl> LayerIteratorType; 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list); 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (LayerIteratorType it = 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerIteratorType::Begin(&render_surface_layer_list); 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) it != end; ++it) { 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!it.represents_itself()) 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) continue; 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avallee): Figure out if we should show something for a layer who's 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // animating bounds but that we can't compute them. 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::BoxF inflated_bounds; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!LayerUtils::GetAnimationBounds(**it, &inflated_bounds)) 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) continue; 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch debug_rects_.push_back( 286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DebugRect(ANIMATION_BOUNDS_RECT_TYPE, 287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::ToEnclosingRect(gfx::RectF(inflated_bounds.x(), 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inflated_bounds.y(), 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inflated_bounds.width(), 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inflated_bounds.height())))); 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 295