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 #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