1 // Copyright 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CC_DEBUG_DEBUG_RECT_HISTORY_H_ 6 #define CC_DEBUG_DEBUG_RECT_HISTORY_H_ 7 8 #include <vector> 9 #include "base/basictypes.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "cc/layers/layer_lists.h" 12 #include "ui/gfx/rect.h" 13 14 namespace cc { 15 16 class LayerImpl; 17 class LayerTreeDebugState; 18 19 // There are currently six types of debug rects: 20 // 21 // - Paint rects (update rects): regions of a layer that needed to be 22 // re-uploaded to the texture resource; in most cases implying that they had to 23 // be repainted, too. 24 // 25 // - Property-changed rects: enclosing bounds of layers that cause changes to 26 // the screen even if the layer did not change internally. (For example, if the 27 // layer's opacity or position changes.) 28 // 29 // - Surface damage rects: the aggregate damage on a target surface that is 30 // caused by all layers and surfaces that contribute to it. This includes (1) 31 // paint rects, (2) property- changed rects, and (3) newly exposed areas. 32 // 33 // - Screen space rects: this is the region the contents occupy in screen space. 34 // 35 // - Replica screen space rects: this is the region the replica's contents 36 // occupy in screen space. 37 // 38 // - Occluding rects: these are the regions that contribute to the occluded 39 // region. 40 // 41 // - Non-Occluding rects: these are the regions of composited layers that do not 42 // contribute to the occluded region. 43 // 44 enum DebugRectType { 45 PAINT_RECT_TYPE, 46 PROPERTY_CHANGED_RECT_TYPE, 47 SURFACE_DAMAGE_RECT_TYPE, 48 SCREEN_SPACE_RECT_TYPE, 49 REPLICA_SCREEN_SPACE_RECT_TYPE, 50 OCCLUDING_RECT_TYPE, 51 NONOCCLUDING_RECT_TYPE, 52 TOUCH_EVENT_HANDLER_RECT_TYPE, 53 WHEEL_EVENT_HANDLER_RECT_TYPE, 54 SCROLL_EVENT_HANDLER_RECT_TYPE, 55 NON_FAST_SCROLLABLE_RECT_TYPE, 56 ANIMATION_BOUNDS_RECT_TYPE, 57 }; 58 59 struct DebugRect { 60 DebugRect(DebugRectType new_type, const gfx::Rect& new_rect) 61 : type(new_type), rect(new_rect) {} 62 63 DebugRectType type; 64 gfx::Rect rect; 65 }; 66 67 // This class maintains a history of rects of various types that can be used 68 // for debugging purposes. The overhead of collecting rects is performed only if 69 // the appropriate LayerTreeSettings are enabled. 70 class DebugRectHistory { 71 public: 72 static scoped_ptr<DebugRectHistory> Create(); 73 74 ~DebugRectHistory(); 75 76 // Note: Saving debug rects must happen before layers' change tracking is 77 // reset. 78 void SaveDebugRectsForCurrentFrame( 79 LayerImpl* root_layer, 80 LayerImpl* hud_layer, 81 const LayerImplList& render_surface_layer_list, 82 const std::vector<gfx::Rect>& occluding_screen_space_rects, 83 const std::vector<gfx::Rect>& non_occluding_screen_space_rects, 84 const LayerTreeDebugState& debug_state); 85 86 const std::vector<DebugRect>& debug_rects() { return debug_rects_; } 87 88 private: 89 DebugRectHistory(); 90 91 void SavePaintRects(LayerImpl* layer); 92 void SavePropertyChangedRects(const LayerImplList& render_surface_layer_list, 93 LayerImpl* hud_layer); 94 void SaveSurfaceDamageRects( 95 const LayerImplList& render_surface_layer_list); 96 void SaveScreenSpaceRects( 97 const LayerImplList& render_surface_layer_list); 98 void SaveOccludingRects( 99 const std::vector<gfx::Rect>& occluding_screen_space_rects); 100 void SaveNonOccludingRects( 101 const std::vector<gfx::Rect>& non_occluding_screen_space_rects); 102 void SaveTouchEventHandlerRects(LayerImpl* layer); 103 void SaveTouchEventHandlerRectsCallback(LayerImpl* layer); 104 void SaveWheelEventHandlerRects(LayerImpl* layer); 105 void SaveWheelEventHandlerRectsCallback(LayerImpl* layer); 106 void SaveScrollEventHandlerRects(LayerImpl* layer); 107 void SaveScrollEventHandlerRectsCallback(LayerImpl* layer); 108 void SaveNonFastScrollableRects(LayerImpl* layer); 109 void SaveNonFastScrollableRectsCallback(LayerImpl* layer); 110 void SaveLayerAnimationBoundsRects( 111 const LayerImplList& render_surface_layer_list); 112 113 std::vector<DebugRect> debug_rects_; 114 115 DISALLOW_COPY_AND_ASSIGN(DebugRectHistory); 116 }; 117 118 } // namespace cc 119 120 #endif // CC_DEBUG_DEBUG_RECT_HISTORY_H_ 121