Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Side by Side Diff: cc/resources/picture_layer_tiling_set.cc

Issue 12865017: Makes tile-creation lazy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixing unit tests and an optimization to CreateTile Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/picture_layer_tiling_set.h" 5 #include "cc/resources/picture_layer_tiling_set.h"
6 6
7 namespace cc { 7 namespace cc {
8 8
9 namespace { 9 namespace {
10 10
11 class LargestToSmallestScaleFunctor { 11 class LargestToSmallestScaleFunctor {
12 public: 12 public:
13 bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { 13 bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) {
14 return left->contents_scale() > right->contents_scale(); 14 return left->contents_scale() > right->contents_scale();
15 } 15 }
16 }; 16 };
17 17
18 } // namespace 18 } // namespace
19 19
20 20
21 PictureLayerTilingSet::PictureLayerTilingSet( 21 PictureLayerTilingSet::PictureLayerTilingSet(
22 PictureLayerTilingClient * client) 22 PictureLayerTilingClient* client,
23 : client_(client) { 23 gfx::Size layer_bounds)
24 : client_(client),
25 layer_bounds_(layer_bounds) {
24 } 26 }
25 27
26 PictureLayerTilingSet::~PictureLayerTilingSet() { 28 PictureLayerTilingSet::~PictureLayerTilingSet() {
27 } 29 }
28 30
29 void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { 31 void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) {
30 client_ = client; 32 client_ = client;
31 for (size_t i = 0; i < tilings_.size(); ++i) 33 for (size_t i = 0; i < tilings_.size(); ++i)
32 tilings_[i]->SetClient(client_); 34 tilings_[i]->SetClient(client_);
33 } 35 }
34 36
35 void PictureLayerTilingSet::CloneAll( 37 void PictureLayerTilingSet::CloneAll(
36 const PictureLayerTilingSet& other, 38 const PictureLayerTilingSet& other,
37 const Region& invalidation,
38 float minimum_contents_scale) { 39 float minimum_contents_scale) {
39 tilings_.clear(); 40 tilings_.clear();
40 tilings_.reserve(other.tilings_.size()); 41 tilings_.reserve(other.tilings_.size());
41 for (size_t i = 0; i < other.tilings_.size(); ++i) { 42 for (size_t i = 0; i < other.tilings_.size(); ++i) {
42 if (other.tilings_[i]->contents_scale() < minimum_contents_scale) 43 const PictureLayerTiling* tiling = other.tilings_[i];
44 if (tiling->contents_scale() < minimum_contents_scale)
43 continue; 45 continue;
44 Clone(other.tilings_[i], invalidation); 46 tilings_.push_back(tiling->Clone(layer_bounds_, client_));
45 } 47 }
48 tilings_.sort(LargestToSmallestScaleFunctor());
46 } 49 }
47 50
48 void PictureLayerTilingSet::Clone( 51 void PictureLayerTilingSet::Clone(const PictureLayerTiling* tiling) {
49 const PictureLayerTiling* tiling,
50 const Region& invalidation) {
51
52 for (size_t i = 0; i < tilings_.size(); ++i) 52 for (size_t i = 0; i < tilings_.size(); ++i)
53 DCHECK_NE(tilings_[i]->contents_scale(), tiling->contents_scale()); 53 DCHECK_NE(tilings_[i]->contents_scale(), tiling->contents_scale());
54 54
55 tilings_.push_back(tiling->Clone()); 55 tilings_.push_back(tiling->Clone(layer_bounds_, client_));
56 gfx::Size size = tilings_.back()->layer_bounds();
57 tilings_.back()->SetClient(client_);
58 tilings_.back()->Invalidate(invalidation);
59 // Intentionally use this set's layer bounds, as it may have changed.
60 tilings_.back()->SetLayerBounds(layer_bounds_);
61
62 tilings_.sort(LargestToSmallestScaleFunctor()); 56 tilings_.sort(LargestToSmallestScaleFunctor());
63 } 57 }
64 58
65 void PictureLayerTilingSet::SetLayerBounds(gfx::Size layer_bounds) {
66 if (layer_bounds_ == layer_bounds)
67 return;
68 layer_bounds_ = layer_bounds;
69 for (size_t i = 0; i < tilings_.size(); ++i)
70 tilings_[i]->SetLayerBounds(layer_bounds);
71 }
72
73 gfx::Size PictureLayerTilingSet::LayerBounds() const {
74 return layer_bounds_;
75 }
76
77 void PictureLayerTilingSet::Invalidate(const Region& layer_invalidation) {
78 for (size_t i = 0; i < tilings_.size(); ++i)
79 tilings_[i]->Invalidate(layer_invalidation);
80 }
81
82 PictureLayerTiling* PictureLayerTilingSet::AddTiling(float contents_scale) { 59 PictureLayerTiling* PictureLayerTilingSet::AddTiling(float contents_scale) {
83 tilings_.push_back(PictureLayerTiling::Create(contents_scale)); 60 tilings_.push_back(PictureLayerTiling::Create(contents_scale,
61 layer_bounds_,
62 client_));
84 PictureLayerTiling* appended = tilings_.back(); 63 PictureLayerTiling* appended = tilings_.back();
85 appended->SetClient(client_);
86 appended->SetLayerBounds(layer_bounds_);
87 64
88 tilings_.sort(LargestToSmallestScaleFunctor()); 65 tilings_.sort(LargestToSmallestScaleFunctor());
89 return appended; 66 return appended;
90 } 67 }
91 68
92 void PictureLayerTilingSet::RemoveAllTilings() { 69 void PictureLayerTilingSet::RemoveAllTilings() {
93 tilings_.clear(); 70 tilings_.clear();
94 } 71 }
95 72
96 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { 73 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) {
97 ScopedPtrVector<PictureLayerTiling>::iterator iter = 74 ScopedPtrVector<PictureLayerTiling>::iterator iter =
98 std::find(tilings_.begin(), tilings_.end(), tiling); 75 std::find(tilings_.begin(), tilings_.end(), tiling);
99 if (iter == tilings_.end()) 76 if (iter == tilings_.end())
100 return; 77 return;
101 tilings_.erase(iter); 78 tilings_.erase(iter);
102 } 79 }
103 80
104 void PictureLayerTilingSet::RemoveAllTiles() { 81 void PictureLayerTilingSet::RemoveAllTiles() {
105 for (size_t i = 0; i < tilings_.size(); ++i) 82 for (size_t i = 0; i < tilings_.size(); ++i)
106 tilings_[i]->Reset(); 83 tilings_[i]->Reset();
107 } 84 }
108 85
109 void PictureLayerTilingSet::CreateTilesFromLayerRect(gfx::Rect layer_rect) {
110 for (size_t i = 0; i < tilings_.size(); ++i)
111 tilings_[i]->CreateTilesFromLayerRect(layer_rect);
112 }
113
114 PictureLayerTilingSet::Iterator::Iterator( 86 PictureLayerTilingSet::Iterator::Iterator(
115 const PictureLayerTilingSet* set, 87 const PictureLayerTilingSet* set,
116 float contents_scale, 88 float contents_scale,
117 gfx::Rect content_rect, 89 gfx::Rect content_rect,
118 float ideal_contents_scale) 90 float ideal_contents_scale)
119 : set_(set), 91 : set_(set),
120 contents_scale_(contents_scale), 92 contents_scale_(contents_scale),
121 ideal_contents_scale_(ideal_contents_scale), 93 ideal_contents_scale_(ideal_contents_scale),
122 current_tiling_(-1) { 94 current_tiling_(-1) {
123 missing_region_.Union(content_rect); 95 missing_region_.Union(content_rect);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 } 278 }
307 279
308 scoped_ptr<base::Value> PictureLayerTilingSet::AsValue() const { 280 scoped_ptr<base::Value> PictureLayerTilingSet::AsValue() const {
309 scoped_ptr<base::ListValue> state(new base::ListValue()); 281 scoped_ptr<base::ListValue> state(new base::ListValue());
310 for (size_t i = 0; i < tilings_.size(); ++i) 282 for (size_t i = 0; i < tilings_.size(); ++i)
311 state->Append(tilings_[i]->AsValue().release()); 283 state->Append(tilings_[i]->AsValue().release());
312 return state.PassAs<base::Value>(); 284 return state.PassAs<base::Value>();
313 } 285 }
314 286
315 } // namespace cc 287 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698