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