OLD | NEW |
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 #include <limits> | 7 #include <limits> |
8 | 8 |
9 namespace cc { | 9 namespace cc { |
10 | 10 |
11 namespace { | 11 namespace { |
12 | 12 |
13 class LargestToSmallestScaleFunctor { | 13 class LargestToSmallestScaleFunctor { |
14 public: | 14 public: |
15 bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { | 15 bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { |
16 return left->contents_scale() > right->contents_scale(); | 16 return left->contents_scale() > right->contents_scale(); |
17 } | 17 } |
18 }; | 18 }; |
19 | 19 |
20 } // namespace | 20 } // namespace |
21 | 21 |
| 22 // static |
| 23 scoped_ptr<PictureLayerTilingSet> PictureLayerTilingSet::Create( |
| 24 PictureLayerTilingClient* client) { |
| 25 return make_scoped_ptr(new PictureLayerTilingSet(client)); |
| 26 } |
| 27 |
22 PictureLayerTilingSet::PictureLayerTilingSet(PictureLayerTilingClient* client) | 28 PictureLayerTilingSet::PictureLayerTilingSet(PictureLayerTilingClient* client) |
23 : client_(client) { | 29 : client_(client) { |
24 } | 30 } |
25 | 31 |
26 PictureLayerTilingSet::~PictureLayerTilingSet() { | 32 PictureLayerTilingSet::~PictureLayerTilingSet() { |
27 } | 33 } |
28 | 34 |
29 void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { | 35 void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { |
30 client_ = client; | 36 client_ = client; |
31 for (size_t i = 0; i < tilings_.size(); ++i) | 37 for (size_t i = 0; i < tilings_.size(); ++i) |
32 tilings_[i]->SetClient(client_); | 38 tilings_[i]->SetClient(client_); |
33 } | 39 } |
34 | 40 |
35 void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { | 41 void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { |
36 for (size_t i = 0; i < tilings_.size(); ++i) | 42 for (size_t i = 0; i < tilings_.size(); ++i) |
37 tilings_[i]->RemoveTilesInRegion(region); | 43 tilings_[i]->RemoveTilesInRegion(region); |
38 } | 44 } |
39 | 45 |
40 bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, | 46 bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
41 const gfx::Size& new_layer_bounds, | 47 const gfx::Size& new_layer_bounds, |
42 const Region& layer_invalidation, | 48 const Region& layer_invalidation, |
43 float minimum_contents_scale) { | 49 float minimum_contents_scale, |
| 50 RasterSource* raster_source) { |
44 if (new_layer_bounds.IsEmpty()) { | 51 if (new_layer_bounds.IsEmpty()) { |
45 RemoveAllTilings(); | 52 RemoveAllTilings(); |
46 return false; | 53 return false; |
47 } | 54 } |
48 | 55 |
49 tilings_.reserve(other.tilings_.size()); | 56 tilings_.reserve(other.tilings_.size()); |
50 | 57 |
51 // Remove any tilings that aren't in |other| or don't meet the minimum. | 58 // Remove any tilings that aren't in |other| or don't meet the minimum. |
52 for (size_t i = 0; i < tilings_.size(); ++i) { | 59 for (size_t i = 0; i < tilings_.size(); ++i) { |
53 float scale = tilings_[i]->contents_scale(); | 60 float scale = tilings_[i]->contents_scale(); |
54 if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale)) | 61 if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale)) |
55 continue; | 62 continue; |
56 // Swap with the last element and remove it. | 63 // Swap with the last element and remove it. |
57 tilings_.swap(tilings_.begin() + i, tilings_.end() - 1); | 64 tilings_.swap(tilings_.begin() + i, tilings_.end() - 1); |
58 tilings_.pop_back(); | 65 tilings_.pop_back(); |
59 --i; | 66 --i; |
60 } | 67 } |
61 | 68 |
62 bool have_high_res_tiling = false; | 69 bool have_high_res_tiling = false; |
63 | 70 |
64 // Add any missing tilings from |other| that meet the minimum. | 71 // Add any missing tilings from |other| that meet the minimum. |
65 for (size_t i = 0; i < other.tilings_.size(); ++i) { | 72 for (size_t i = 0; i < other.tilings_.size(); ++i) { |
66 float contents_scale = other.tilings_[i]->contents_scale(); | 73 float contents_scale = other.tilings_[i]->contents_scale(); |
67 if (contents_scale < minimum_contents_scale) | 74 if (contents_scale < minimum_contents_scale) |
68 continue; | 75 continue; |
69 if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) { | 76 if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) { |
70 this_tiling->set_resolution(other.tilings_[i]->resolution()); | 77 this_tiling->set_resolution(other.tilings_[i]->resolution()); |
71 | 78 |
72 this_tiling->UpdateTilesToCurrentRasterSource(layer_invalidation, | 79 this_tiling->UpdateTilesToCurrentRasterSource( |
73 new_layer_bounds); | 80 raster_source, layer_invalidation, new_layer_bounds); |
74 this_tiling->CreateMissingTilesInLiveTilesRect(); | 81 this_tiling->CreateMissingTilesInLiveTilesRect(); |
75 if (this_tiling->resolution() == HIGH_RESOLUTION) | 82 if (this_tiling->resolution() == HIGH_RESOLUTION) |
76 have_high_res_tiling = true; | 83 have_high_res_tiling = true; |
77 | 84 |
78 DCHECK(this_tiling->tile_size() == | 85 DCHECK(this_tiling->tile_size() == |
79 client_->CalculateTileSize(this_tiling->tiling_size())) | 86 client_->CalculateTileSize(this_tiling->tiling_size())) |
80 << "tile_size: " << this_tiling->tile_size().ToString() | 87 << "tile_size: " << this_tiling->tile_size().ToString() |
81 << " tiling_size: " << this_tiling->tiling_size().ToString() | 88 << " tiling_size: " << this_tiling->tiling_size().ToString() |
82 << " CalculateTileSize: " | 89 << " CalculateTileSize: " |
83 << client_->CalculateTileSize(this_tiling->tiling_size()).ToString(); | 90 << client_->CalculateTileSize(this_tiling->tiling_size()).ToString(); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 if (iter == tilings_.end()) | 145 if (iter == tilings_.end()) |
139 return; | 146 return; |
140 tilings_.erase(iter); | 147 tilings_.erase(iter); |
141 } | 148 } |
142 | 149 |
143 void PictureLayerTilingSet::RemoveAllTiles() { | 150 void PictureLayerTilingSet::RemoveAllTiles() { |
144 for (size_t i = 0; i < tilings_.size(); ++i) | 151 for (size_t i = 0; i < tilings_.size(); ++i) |
145 tilings_[i]->Reset(); | 152 tilings_[i]->Reset(); |
146 } | 153 } |
147 | 154 |
| 155 bool PictureLayerTilingSet::UpdateTilePriorities( |
| 156 const gfx::Rect& required_rect_in_layer_space, |
| 157 float ideal_contents_scale, |
| 158 double current_frame_time_in_seconds, |
| 159 const Occlusion& occlusion_in_layer_space, |
| 160 bool can_require_tiles_for_activation) { |
| 161 bool tiling_needs_update = false; |
| 162 // TODO(vmpstr): Check if we have to early out here, or if we can just do it |
| 163 // as part of computing tile priority rects for tilings. |
| 164 for (auto* tiling : tilings_) { |
| 165 if (tiling->NeedsUpdateForFrameAtTimeAndViewport( |
| 166 current_frame_time_in_seconds, required_rect_in_layer_space)) { |
| 167 tiling_needs_update = true; |
| 168 break; |
| 169 } |
| 170 } |
| 171 if (!tiling_needs_update) |
| 172 return false; |
| 173 |
| 174 for (auto* tiling : tilings_) { |
| 175 tiling->set_can_require_tiles_for_activation( |
| 176 can_require_tiles_for_activation); |
| 177 tiling->ComputeTilePriorityRects( |
| 178 required_rect_in_layer_space, ideal_contents_scale, |
| 179 current_frame_time_in_seconds, occlusion_in_layer_space); |
| 180 } |
| 181 return true; |
| 182 } |
| 183 |
148 PictureLayerTilingSet::CoverageIterator::CoverageIterator( | 184 PictureLayerTilingSet::CoverageIterator::CoverageIterator( |
149 const PictureLayerTilingSet* set, | 185 const PictureLayerTilingSet* set, |
150 float contents_scale, | 186 float contents_scale, |
151 const gfx::Rect& content_rect, | 187 const gfx::Rect& content_rect, |
152 float ideal_contents_scale) | 188 float ideal_contents_scale) |
153 : set_(set), | 189 : set_(set), |
154 contents_scale_(contents_scale), | 190 contents_scale_(contents_scale), |
155 ideal_contents_scale_(ideal_contents_scale), | 191 ideal_contents_scale_(ideal_contents_scale), |
156 current_tiling_(-1) { | 192 current_tiling_(-1) { |
157 missing_region_.Union(content_rect); | 193 missing_region_.Union(content_rect); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 case LOWER_THAN_LOW_RES: | 401 case LOWER_THAN_LOW_RES: |
366 range = TilingRange(low_res_range.end, tilings_.size()); | 402 range = TilingRange(low_res_range.end, tilings_.size()); |
367 break; | 403 break; |
368 } | 404 } |
369 | 405 |
370 DCHECK_LE(range.start, range.end); | 406 DCHECK_LE(range.start, range.end); |
371 return range; | 407 return range; |
372 } | 408 } |
373 | 409 |
374 } // namespace cc | 410 } // namespace cc |
OLD | NEW |