Home | History | Annotate | Download | only in debug
      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