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