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 #include "ui/gfx/rect_f.h" 14 15 namespace cc { 16 17 class LayerImpl; 18 class LayerTreeDebugState; 19 20 // There are currently six types of debug rects: 21 // 22 // - Paint rects (update rects): regions of a layer that needed to be 23 // re-uploaded to the texture resource; in most cases implying that they had to 24 // be repainted, too. 25 // 26 // - Property-changed rects: enclosing bounds of layers that cause changes to 27 // the screen even if the layer did not change internally. (For example, if the 28 // layer's opacity or position changes.) 29 // 30 // - Surface damage rects: the aggregate damage on a target surface that is 31 // caused by all layers and surfaces that contribute to it. This includes (1) 32 // paint rects, (2) property- changed rects, and (3) newly exposed areas. 33 // 34 // - Screen space rects: this is the region the contents occupy in screen space. 35 // 36 // - Replica screen space rects: this is the region the replica's contents 37 // occupy in screen space. 38 // 39 // - Occluding rects: these are the regions that contribute to the occluded 40 // region. 41 // 42 // - Non-Occluding rects: these are the regions of composited layers that do not 43 // contribute to the occluded region. 44 // 45 enum DebugRectType { 46 PAINT_RECT_TYPE, 47 PROPERTY_CHANGED_RECT_TYPE, 48 SURFACE_DAMAGE_RECT_TYPE, 49 SCREEN_SPACE_RECT_TYPE, 50 REPLICA_SCREEN_SPACE_RECT_TYPE, 51 OCCLUDING_RECT_TYPE, 52 NONOCCLUDING_RECT_TYPE, 53 TOUCH_EVENT_HANDLER_RECT_TYPE, 54 WHEEL_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, gfx::RectF new_rect) 61 : type(new_type), rect(new_rect) {} 62 63 DebugRectType type; 64 gfx::RectF 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 const LayerImplList& render_surface_layer_list, 81 const std::vector<gfx::Rect>& occluding_screen_space_rects, 82 const std::vector<gfx::Rect>& non_occluding_screen_space_rects, 83 const LayerTreeDebugState& debug_state); 84 85 const std::vector<DebugRect>& debug_rects() { return debug_rects_; } 86 87 private: 88 DebugRectHistory(); 89 90 void SavePaintRects(LayerImpl* layer); 91 void SavePropertyChangedRects( 92 const LayerImplList& render_surface_layer_list); 93 void SaveSurfaceDamageRects( 94 const LayerImplList& render_surface_layer_list); 95 void SaveScreenSpaceRects( 96 const LayerImplList& render_surface_layer_list); 97 void SaveOccludingRects( 98 const std::vector<gfx::Rect>& occluding_screen_space_rects); 99 void SaveNonOccludingRects( 100 const std::vector<gfx::Rect>& non_occluding_screen_space_rects); 101 void SaveTouchEventHandlerRects(LayerImpl* layer); 102 void SaveTouchEventHandlerRectsCallback(LayerImpl* layer); 103 void SaveWheelEventHandlerRects(LayerImpl* layer); 104 void SaveWheelEventHandlerRectsCallback(LayerImpl* layer); 105 void SaveNonFastScrollableRects(LayerImpl* layer); 106 void SaveNonFastScrollableRectsCallback(LayerImpl* layer); 107 void SaveLayerAnimationBoundsRects( 108 const LayerImplList& render_surface_layer_list); 109 110 std::vector<DebugRect> debug_rects_; 111 112 DISALLOW_COPY_AND_ASSIGN(DebugRectHistory); 113 }; 114 115 } // namespace cc 116 117 #endif // CC_DEBUG_DEBUG_RECT_HISTORY_H_ 118