Index: cc/resources/picture_layer_tiling_set.cc |
diff --git a/cc/resources/picture_layer_tiling_set.cc b/cc/resources/picture_layer_tiling_set.cc |
index 51896a5b5f7f29cfb287e970fb8b301aaa4b83a0..a3348bc72d350f608c21555cef7a60ed9da5c727 100644 |
--- a/cc/resources/picture_layer_tiling_set.cc |
+++ b/cc/resources/picture_layer_tiling_set.cc |
@@ -29,26 +29,98 @@ inline float LargerRatio(float float1, float float2) { |
// static |
scoped_ptr<PictureLayerTilingSet> PictureLayerTilingSet::Create( |
- PictureLayerTilingClient* client) { |
- return make_scoped_ptr(new PictureLayerTilingSet(client)); |
-} |
- |
-PictureLayerTilingSet::PictureLayerTilingSet(PictureLayerTilingClient* client) |
- : client_(client) { |
+ PictureLayerTilingClient* client, |
+ size_t max_tiles_for_interest_area, |
+ float skewport_target_time_in_seconds, |
+ int skewport_extrapolation_limit_in_content_pixels) { |
+ return make_scoped_ptr(new PictureLayerTilingSet( |
+ client, max_tiles_for_interest_area, skewport_target_time_in_seconds, |
+ skewport_extrapolation_limit_in_content_pixels)); |
+} |
+ |
+PictureLayerTilingSet::PictureLayerTilingSet( |
+ PictureLayerTilingClient* client, |
+ size_t max_tiles_for_interest_area, |
+ float skewport_target_time_in_seconds, |
+ int skewport_extrapolation_limit_in_content_pixels) |
+ : max_tiles_for_interest_area_(max_tiles_for_interest_area), |
+ skewport_target_time_in_seconds_(skewport_target_time_in_seconds), |
+ skewport_extrapolation_limit_in_content_pixels_( |
+ skewport_extrapolation_limit_in_content_pixels), |
+ client_(client) { |
} |
PictureLayerTilingSet::~PictureLayerTilingSet() { |
} |
-void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { |
- client_ = client; |
- for (size_t i = 0; i < tilings_.size(); ++i) |
- tilings_[i]->SetClient(client_); |
-} |
+void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSource( |
+ RasterSource* raster_source, |
+ const PictureLayerTilingSet* twin_set, |
+ const gfx::Size& layer_bounds, |
+ const Region& layer_invalidation, |
+ float minimum_contents_scale) { |
+ RemoveTilingsBelowScale(minimum_contents_scale); |
-void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { |
- for (size_t i = 0; i < tilings_.size(); ++i) |
- tilings_[i]->RemoveTilesInRegion(region); |
+ // Copy over tilings that are shared with the |twin_set| tiling set (if it |
+ // exists). |
+ if (twin_set) { |
+ for (PictureLayerTiling* twin_tiling : twin_set->tilings_) { |
+ float contents_scale = twin_tiling->contents_scale(); |
+ DCHECK_GE(contents_scale, minimum_contents_scale); |
+ |
+ PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); |
+ if (!this_tiling) { |
+ scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( |
+ contents_scale, layer_bounds, client_, max_tiles_for_interest_area_, |
+ skewport_target_time_in_seconds_, |
+ skewport_extrapolation_limit_in_content_pixels_); |
+ tilings_.push_back(new_tiling.Pass()); |
+ this_tiling = tilings_.back(); |
+ } |
+ this_tiling->CloneTilesAndPropertiesFrom(*twin_tiling); |
+ } |
+ } |
+ |
+ // For unshared tilings, invalidate tiles and update them to the new raster |
+ // source. |
+ for (PictureLayerTiling* tiling : tilings_) { |
+ if (twin_set && twin_set->FindTilingWithScale(tiling->contents_scale())) |
+ continue; |
+ |
+ tiling->Resize(layer_bounds); |
+ tiling->Invalidate(layer_invalidation); |
+ tiling->SetRasterSource(raster_source); |
+ // This is needed for cases where the live tiles rect didn't change but |
+ // recordings exist in the raster source that did not exist on the last |
+ // raster source. |
+ tiling->CreateMissingTilesInLiveTilesRect(); |
+ |
+ // If |twin_set| is present, use the resolutions from there. Otherwise leave |
+ // all resolutions as they are. |
+ if (twin_set) |
+ tiling->set_resolution(NON_IDEAL_RESOLUTION); |
+ } |
+ |
+ tilings_.sort(LargestToSmallestScaleFunctor()); |
+ |
+#if DCHECK_IS_ON |
+ for (PictureLayerTiling* tiling : tilings_) { |
+ DCHECK(tiling->tile_size() == |
+ client_->CalculateTileSize(tiling->tiling_size())) |
+ << "tile_size: " << tiling->tile_size().ToString() |
+ << " tiling_size: " << tiling->tiling_size().ToString() |
+ << " CalculateTileSize: " |
+ << client_->CalculateTileSize(tiling->tiling_size()).ToString(); |
+ } |
+ |
+ if (!tilings_.empty()) { |
+ size_t num_high_res = std::count_if(tilings_.begin(), tilings_.end(), |
+ [](PictureLayerTiling* tiling) { |
+ return tiling->resolution() == HIGH_RESOLUTION; |
+ }); |
+ DCHECK_EQ(1u, num_high_res); |
+ } |
+#endif |
} |
void PictureLayerTilingSet::CleanUpTilings( |
@@ -91,14 +163,6 @@ void PictureLayerTilingSet::CleanUpTilings( |
} |
for (auto* tiling : to_remove) { |
- PictureLayerTiling* twin_tiling = |
- twin_set ? twin_set->FindTilingWithScale(tiling->contents_scale()) |
- : nullptr; |
- // Only remove tilings from the twin layer if they have |
- // NON_IDEAL_RESOLUTION. |
- if (twin_tiling && twin_tiling->resolution() == NON_IDEAL_RESOLUTION) |
- twin_set->Remove(twin_tiling); |
- |
PictureLayerTiling* recycled_twin_tiling = |
recycled_twin_set |
? recycled_twin_set->FindTilingWithScale(tiling->contents_scale()) |
@@ -113,16 +177,24 @@ void PictureLayerTilingSet::CleanUpTilings( |
} |
} |
+void PictureLayerTilingSet::RemoveNonIdealTilings() { |
+ auto to_remove = tilings_.remove_if([](PictureLayerTiling* t) { |
+ return t->resolution() == NON_IDEAL_RESOLUTION; |
+ }); |
+ tilings_.erase(to_remove, tilings_.end()); |
+} |
+ |
void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { |
for (auto* tiling : tilings_) |
tiling->set_resolution(NON_IDEAL_RESOLUTION); |
} |
-bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
- const gfx::Size& new_layer_bounds, |
- const Region& layer_invalidation, |
- float minimum_contents_scale, |
- RasterSource* raster_source) { |
+bool PictureLayerTilingSet::SyncTilingsForTesting( |
+ const PictureLayerTilingSet& other, |
+ const gfx::Size& new_layer_bounds, |
+ const Region& layer_invalidation, |
+ float minimum_contents_scale, |
+ RasterSource* raster_source) { |
if (new_layer_bounds.IsEmpty()) { |
RemoveAllTilings(); |
return false; |
@@ -151,8 +223,9 @@ bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
if (PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale)) { |
this_tiling->set_resolution(other.tilings_[i]->resolution()); |
- this_tiling->UpdateTilesToCurrentRasterSource( |
- raster_source, layer_invalidation, new_layer_bounds); |
+ this_tiling->Resize(new_layer_bounds); |
+ this_tiling->Invalidate(layer_invalidation); |
+ this_tiling->SetRasterSource(raster_source); |
this_tiling->CreateMissingTilesInLiveTilesRect(); |
if (this_tiling->resolution() == HIGH_RESOLUTION) |
have_high_res_tiling = true; |
@@ -166,9 +239,9 @@ bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
continue; |
} |
scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( |
- contents_scale, |
- new_layer_bounds, |
- client_); |
+ contents_scale, new_layer_bounds, client_, max_tiles_for_interest_area_, |
+ skewport_target_time_in_seconds_, |
+ skewport_extrapolation_limit_in_content_pixels_); |
new_tiling->set_resolution(other.tilings_[i]->resolution()); |
if (new_tiling->resolution() == HIGH_RESOLUTION) |
have_high_res_tiling = true; |
@@ -185,8 +258,10 @@ PictureLayerTiling* PictureLayerTilingSet::AddTiling( |
for (size_t i = 0; i < tilings_.size(); ++i) |
DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); |
- tilings_.push_back( |
- PictureLayerTiling::Create(contents_scale, layer_bounds, client_)); |
+ tilings_.push_back(PictureLayerTiling::Create( |
+ contents_scale, layer_bounds, client_, max_tiles_for_interest_area_, |
+ skewport_target_time_in_seconds_, |
+ skewport_extrapolation_limit_in_content_pixels_)); |
PictureLayerTiling* appended = tilings_.back(); |
tilings_.sort(LargestToSmallestScaleFunctor()); |
@@ -222,6 +297,14 @@ PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( |
return *iter; |
} |
+void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { |
+ auto to_remove = |
+ tilings_.remove_if([minimum_scale](PictureLayerTiling* tiling) { |
+ return tiling->contents_scale() < minimum_scale; |
+ }); |
+ tilings_.erase(to_remove, tilings_.end()); |
+} |
+ |
void PictureLayerTilingSet::RemoveAllTilings() { |
tilings_.clear(); |
} |