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