12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TREES_DAMAGE_TRACKER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TREES_DAMAGE_TRACKER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/layer_lists.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_f.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkImageFilter; 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Rect; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FilterOperations; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerImpl; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderSurfaceImpl; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Computes the region where pixels have actually changed on a 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderSurfaceImpl. This region is used to scissor what is actually drawn to 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the screen to save GPU computation and bandwidth. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT DamageTracker { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<DamageTracker> Create(); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~DamageTracker(); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidDrawDamagedArea() { current_damage_rect_ = gfx::RectF(); } 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AddDamageNextUpdate(gfx::RectF dmg) { current_damage_rect_.Union(dmg); } 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateDamageTrackingState( 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& layer_list, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int target_surface_layer_id, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool target_surface_property_changed_only_from_descendant, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect target_surface_content_rect, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* target_surface_mask_layer, 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const FilterOperations& filters); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF current_damage_rect() { return current_damage_rect_; } 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DamageTracker(); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF TrackDamageFromActiveLayers( 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LayerImplList& layer_list, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int target_surface_layer_id); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF TrackDamageFromSurfaceMask(LayerImpl* target_surface_mask_layer); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF TrackDamageFromLeftoverRects(); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void PrepareRectHistoryForUpdate(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These helper functions are used only in TrackDamageFromActiveLayers(). 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExtendDamageForLayer(LayerImpl* layer, gfx::RectF* target_damage_rect); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExtendDamageForRenderSurface(LayerImpl* layer, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF* target_damage_rect); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) struct RectMapData { 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RectMapData() : layer_id_(0), mailboxId_(0) {} 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit RectMapData(int layer_id) : layer_id_(layer_id), mailboxId_(0) {} 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Update(const gfx::RectF& rect, unsigned int mailboxId) { 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mailboxId_ = mailboxId; 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) rect_ = rect; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool operator < (const RectMapData& other) const { 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return layer_id_ < other.layer_id_; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int layer_id_; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int mailboxId_; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::RectF rect_; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef std::vector<RectMapData> SortedRectMap; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RectMapData& RectDataForLayer(int layer_id, bool* layer_is_new); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SortedRectMap rect_history_; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int mailboxId_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF current_damage_rect_; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DamageTracker); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_TREES_DAMAGE_TRACKER_H_ 93