1// Copyright 2011 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_TREES_DAMAGE_TRACKER_H_ 6#define CC_TREES_DAMAGE_TRACKER_H_ 7 8#include <vector> 9#include "base/memory/scoped_ptr.h" 10#include "cc/base/cc_export.h" 11#include "cc/layers/layer_lists.h" 12#include "ui/gfx/rect_f.h" 13 14class SkImageFilter; 15 16namespace gfx { 17class Rect; 18} 19 20namespace cc { 21 22class FilterOperations; 23class LayerImpl; 24class RenderSurfaceImpl; 25 26// 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. 29class CC_EXPORT DamageTracker { 30 public: 31 static scoped_ptr<DamageTracker> Create(); 32 ~DamageTracker(); 33 34 void DidDrawDamagedArea() { current_damage_rect_ = gfx::RectF(); } 35 void AddDamageNextUpdate(gfx::RectF dmg) { current_damage_rect_.Union(dmg); } 36 void UpdateDamageTrackingState( 37 const LayerImplList& layer_list, 38 int target_surface_layer_id, 39 bool target_surface_property_changed_only_from_descendant, 40 gfx::Rect target_surface_content_rect, 41 LayerImpl* target_surface_mask_layer, 42 const FilterOperations& filters); 43 44 gfx::RectF current_damage_rect() { return current_damage_rect_; } 45 46 private: 47 DamageTracker(); 48 49 gfx::RectF TrackDamageFromActiveLayers( 50 const LayerImplList& layer_list, 51 int target_surface_layer_id); 52 gfx::RectF TrackDamageFromSurfaceMask(LayerImpl* target_surface_mask_layer); 53 gfx::RectF TrackDamageFromLeftoverRects(); 54 55 void PrepareRectHistoryForUpdate(); 56 57 // These helper functions are used only in TrackDamageFromActiveLayers(). 58 void ExtendDamageForLayer(LayerImpl* layer, gfx::RectF* target_damage_rect); 59 void ExtendDamageForRenderSurface(LayerImpl* layer, 60 gfx::RectF* target_damage_rect); 61 62 struct RectMapData { 63 RectMapData() : layer_id_(0), mailboxId_(0) {} 64 explicit RectMapData(int layer_id) : layer_id_(layer_id), mailboxId_(0) {} 65 void Update(const gfx::RectF& rect, unsigned int mailboxId) { 66 mailboxId_ = mailboxId; 67 rect_ = rect; 68 } 69 70 bool operator < (const RectMapData& other) const { 71 return layer_id_ < other.layer_id_; 72 } 73 74 int layer_id_; 75 unsigned int mailboxId_; 76 gfx::RectF rect_; 77 }; 78 typedef std::vector<RectMapData> SortedRectMap; 79 80 RectMapData& RectDataForLayer(int layer_id, bool* layer_is_new); 81 82 SortedRectMap rect_history_; 83 84 unsigned int mailboxId_; 85 gfx::RectF current_damage_rect_; 86 87 DISALLOW_COPY_AND_ASSIGN(DamageTracker); 88}; 89 90} // namespace cc 91 92#endif // CC_TREES_DAMAGE_TRACKER_H_ 93