#ifndef CC_TREES_DEBUG_RECT_HISTORY_H_
#define CC_TREES_DEBUG_RECT_HISTORY_H_
#include <memory>
#include <vector>
#include "cc/cc_export.h"
#include "cc/input/touch_action.h"
#include "cc/layers/layer_collections.h"
#include "ui/gfx/geometry/rect.h"
namespace cc {
class LayerImpl;
class LayerTreeDebugState;
class LayerTreeImpl;
class HeadsUpDisplayLayerImpl;
enum class DebugRectType {
kPaint,
kPropertyChanged,
kSurfaceDamage,
kScreenSpace,
kTouchEventHandler,
kWheelEventHandler,
kScrollEventHandler,
kMainThreadScrollHitTest,
kMainThreadScrollRepaint,
kRasterInducingScroll,
kAnimationBounds,
kLayoutShift,
};
struct DebugRect {
DebugRect(DebugRectType new_type,
const gfx::Rect& new_rect,
TouchAction new_touch_action = TouchAction::kNone,
uint32_t main_thread_scroll_repaint_reasons = 0)
: type(new_type),
rect(new_rect),
touch_action(new_touch_action),
main_thread_scroll_repaint_reasons(main_thread_scroll_repaint_reasons) {
DCHECK(type == DebugRectType::kTouchEventHandler ||
touch_action == TouchAction::kNone);
DCHECK(type != DebugRectType::kMainThreadScrollRepaint ||
!main_thread_scroll_repaint_reasons);
}
DebugRectType type;
gfx::Rect rect;
TouchAction touch_action;
uint32_t main_thread_scroll_repaint_reasons;
};
class CC_EXPORT DebugRectHistory {
public:
static std::unique_ptr<DebugRectHistory> Create();
DebugRectHistory(const DebugRectHistory&) = delete;
~DebugRectHistory();
DebugRectHistory& operator=(const DebugRectHistory&) = delete;
void SaveDebugRectsForCurrentFrame(
LayerTreeImpl* tree_impl,
HeadsUpDisplayLayerImpl* hud_layer,
const RenderSurfaceList& render_surface_list,
const LayerTreeDebugState& debug_state);
const std::vector<DebugRect>& debug_rects() { return debug_rects_; }
private:
DebugRectHistory();
void SaveLayoutShiftRects(HeadsUpDisplayLayerImpl* hud);
void SavePaintRects(LayerTreeImpl* tree_impl);
void SavePropertyChangedRects(LayerTreeImpl* tree_impl, LayerImpl* hud_layer);
void SaveSurfaceDamageRects(const RenderSurfaceList& render_surface_list);
void SaveScreenSpaceRects(const RenderSurfaceList& render_surface_list);
void SaveTouchEventHandlerRects(LayerTreeImpl* tree_impl);
void SaveWheelEventHandlerRects(LayerTreeImpl* tree_impl);
void SaveScrollEventHandlerRects(LayerTreeImpl* tree_impl);
void SaveMainThreadScrollHitTestRects(LayerTreeImpl* tree_impl);
void SaveMainThreadScrollRepaintOrRasterInducingScrollRects(
LayerTreeImpl* tree_impl,
DebugRectType type);
std::vector<DebugRect> debug_rects_;
};
}
#endif