blob: 3809447389ab664284b31248c4cabc572b55115e [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"
[email protected]aad0a0072012-11-01 18:15:5812#include "ui/gfx/rect_f.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]be3925ee2013-03-08 02:41:4734 void DidDrawDamagedArea() { current_damage_rect_ = gfx::RectF(); }
[email protected]0023fc72014-01-10 20:05:0635 void AddDamageNextUpdate(const gfx::RectF& dmg) {
36 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]be3925ee2013-03-08 02:41:4746 gfx::RectF 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]be3925ee2013-03-08 02:41:4751 gfx::RectF TrackDamageFromActiveLayers(
[email protected]50761e92013-03-29 20:51:2852 const LayerImplList& layer_list,
[email protected]be3925ee2013-03-08 02:41:4753 int target_surface_layer_id);
54 gfx::RectF TrackDamageFromSurfaceMask(LayerImpl* target_surface_mask_layer);
55 gfx::RectF TrackDamageFromLeftoverRects();
[email protected]cd57cc5a2012-10-12 22:43:4156
[email protected]deacb8e2013-11-25 23:18:5857 void PrepareRectHistoryForUpdate();
[email protected]cd57cc5a2012-10-12 22:43:4158
[email protected]be3925ee2013-03-08 02:41:4759 // These helper functions are used only in TrackDamageFromActiveLayers().
60 void ExtendDamageForLayer(LayerImpl* layer, gfx::RectF* target_damage_rect);
61 void ExtendDamageForRenderSurface(LayerImpl* layer,
62 gfx::RectF* target_damage_rect);
[email protected]cd57cc5a2012-10-12 22:43:4163
[email protected]deacb8e2013-11-25 23:18:5864 struct RectMapData {
65 RectMapData() : layer_id_(0), mailboxId_(0) {}
66 explicit RectMapData(int layer_id) : layer_id_(layer_id), mailboxId_(0) {}
67 void Update(const gfx::RectF& rect, unsigned int mailboxId) {
68 mailboxId_ = mailboxId;
69 rect_ = rect;
70 }
[email protected]cd57cc5a2012-10-12 22:43:4171
[email protected]deacb8e2013-11-25 23:18:5872 bool operator < (const RectMapData& other) const {
73 return layer_id_ < other.layer_id_;
74 }
75
76 int layer_id_;
77 unsigned int mailboxId_;
78 gfx::RectF rect_;
79 };
80 typedef std::vector<RectMapData> SortedRectMap;
81
82 RectMapData& RectDataForLayer(int layer_id, bool* layer_is_new);
83
84 SortedRectMap rect_history_;
85
86 unsigned int mailboxId_;
[email protected]be3925ee2013-03-08 02:41:4787 gfx::RectF current_damage_rect_;
[email protected]52347c842012-11-02 21:06:2088
[email protected]be3925ee2013-03-08 02:41:4789 DISALLOW_COPY_AND_ASSIGN(DamageTracker);
[email protected]cd57cc5a2012-10-12 22:43:4190};
91
[email protected]be3925ee2013-03-08 02:41:4792} // namespace cc
[email protected]cd57cc5a2012-10-12 22:43:4193
[email protected]556fd292013-03-18 08:03:0494#endif // CC_TREES_DAMAGE_TRACKER_H_