blob: aafbd033bcd0d0823a487e0390427920c7b7b4ce [file] [log] [blame]
[email protected]cd57cc5a2012-10-12 22:43:411// Copyright 2011 The Chromium Authors. All rights reserved.
[email protected]0fb25002012-10-12 07:20:022// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
[email protected]cd57cc5a2012-10-12 22:43:414
[email protected]556fd292013-03-18 08:03:045#ifndef CC_TREES_DAMAGE_TRACKER_H_
6#define CC_TREES_DAMAGE_TRACKER_H_
[email protected]cd57cc5a2012-10-12 22:43:417
[email protected]681ccff2013-03-18 06:13:528#include <vector>
[email protected]cd57cc5a2012-10-12 22:43:419#include "base/memory/scoped_ptr.h"
[email protected]681ccff2013-03-18 06:13:5210#include "cc/base/cc_export.h"
[email protected]50761e92013-03-29 20:51:2811#include "cc/layers/layer_lists.h"
heejin.r.chungd28506ba2014-10-23 16:36:2012#include "ui/gfx/geometry/rect.h"
[email protected]cd57cc5a2012-10-12 22:43:4113
[email protected]aad0a0072012-11-01 18:15:5814class SkImageFilter;
15
16namespace gfx {
17class Rect;
18}
19
[email protected]cd57cc5a2012-10-12 22:43:4120namespace cc {
21
[email protected]ae6b1a72013-06-25 18:49:2922class FilterOperations;
[email protected]96baf3e2012-10-22 23:09:5523class LayerImpl;
24class RenderSurfaceImpl;
[email protected]cd57cc5a2012-10-12 22:43:4125
[email protected]be3925ee2013-03-08 02:41:4726// Computes the region where pixels have actually changed on a
27// RenderSurfaceImpl. This region is used to scissor what is actually drawn to
28// the screen to save GPU computation and bandwidth.
[email protected]52347c842012-11-02 21:06:2029class CC_EXPORT DamageTracker {
[email protected]be3925ee2013-03-08 02:41:4730 public:
31 static scoped_ptr<DamageTracker> Create();
32 ~DamageTracker();
[email protected]cd57cc5a2012-10-12 22:43:4133
[email protected]b4ead7b2014-04-07 18:12:1834 void DidDrawDamagedArea() { current_damage_rect_ = gfx::Rect(); }
35 void AddDamageNextUpdate(const gfx::Rect& dmg) {
[email protected]0023fc72014-01-10 20:05:0636 current_damage_rect_.Union(dmg);
37 }
[email protected]be3925ee2013-03-08 02:41:4738 void UpdateDamageTrackingState(
[email protected]50761e92013-03-29 20:51:2839 const LayerImplList& layer_list,
[email protected]be3925ee2013-03-08 02:41:4740 int target_surface_layer_id,
41 bool target_surface_property_changed_only_from_descendant,
[email protected]0023fc72014-01-10 20:05:0642 const gfx::Rect& target_surface_content_rect,
[email protected]be3925ee2013-03-08 02:41:4743 LayerImpl* target_surface_mask_layer,
[email protected]1dc7943e2013-09-26 04:41:4844 const FilterOperations& filters);
[email protected]cd57cc5a2012-10-12 22:43:4145
[email protected]b4ead7b2014-04-07 18:12:1846 gfx::Rect current_damage_rect() { return current_damage_rect_; }
[email protected]cd57cc5a2012-10-12 22:43:4147
[email protected]be3925ee2013-03-08 02:41:4748 private:
49 DamageTracker();
[email protected]cd57cc5a2012-10-12 22:43:4150
[email protected]b4ead7b2014-04-07 18:12:1851 gfx::Rect TrackDamageFromActiveLayers(const LayerImplList& layer_list,
52 int target_surface_layer_id);
53 gfx::Rect TrackDamageFromSurfaceMask(LayerImpl* target_surface_mask_layer);
54 gfx::Rect TrackDamageFromLeftoverRects();
[email protected]cd57cc5a2012-10-12 22:43:4155
[email protected]deacb8e2013-11-25 23:18:5856 void PrepareRectHistoryForUpdate();
[email protected]cd57cc5a2012-10-12 22:43:4157
[email protected]be3925ee2013-03-08 02:41:4758 // These helper functions are used only in TrackDamageFromActiveLayers().
[email protected]b4ead7b2014-04-07 18:12:1859 void ExtendDamageForLayer(LayerImpl* layer, gfx::Rect* target_damage_rect);
[email protected]be3925ee2013-03-08 02:41:4760 void ExtendDamageForRenderSurface(LayerImpl* layer,
[email protected]b4ead7b2014-04-07 18:12:1861 gfx::Rect* target_damage_rect);
[email protected]cd57cc5a2012-10-12 22:43:4162
[email protected]deacb8e2013-11-25 23:18:5863 struct RectMapData {
64 RectMapData() : layer_id_(0), mailboxId_(0) {}
65 explicit RectMapData(int layer_id) : layer_id_(layer_id), mailboxId_(0) {}
[email protected]b4ead7b2014-04-07 18:12:1866 void Update(const gfx::Rect& rect, unsigned int mailboxId) {
[email protected]deacb8e2013-11-25 23:18:5867 mailboxId_ = mailboxId;
68 rect_ = rect;
69 }
[email protected]cd57cc5a2012-10-12 22:43:4170
[email protected]deacb8e2013-11-25 23:18:5871 bool operator < (const RectMapData& other) const {
72 return layer_id_ < other.layer_id_;
73 }
74
75 int layer_id_;
76 unsigned int mailboxId_;
[email protected]b4ead7b2014-04-07 18:12:1877 gfx::Rect rect_;
[email protected]deacb8e2013-11-25 23:18:5878 };
79 typedef std::vector<RectMapData> SortedRectMap;
80
81 RectMapData& RectDataForLayer(int layer_id, bool* layer_is_new);
82
83 SortedRectMap rect_history_;
84
85 unsigned int mailboxId_;
[email protected]b4ead7b2014-04-07 18:12:1886 gfx::Rect current_damage_rect_;
[email protected]52347c842012-11-02 21:06:2087
[email protected]be3925ee2013-03-08 02:41:4788 DISALLOW_COPY_AND_ASSIGN(DamageTracker);
[email protected]cd57cc5a2012-10-12 22:43:4189};
90
[email protected]be3925ee2013-03-08 02:41:4791} // namespace cc
[email protected]cd57cc5a2012-10-12 22:43:4192
[email protected]556fd292013-03-18 08:03:0493#endif // CC_TREES_DAMAGE_TRACKER_H_