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 35170a0baf5e54665be05928bf9d26a51579a8e3..51896a5b5f7f29cfb287e970fb8b301aaa4b83a0 100644 |
--- a/cc/resources/picture_layer_tiling_set.cc |
+++ b/cc/resources/picture_layer_tiling_set.cc |
@@ -6,6 +6,7 @@ |
#include <limits> |
#include <set> |
+#include <vector> |
namespace cc { |
@@ -50,6 +51,68 @@ void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { |
tilings_[i]->RemoveTilesInRegion(region); |
} |
+void PictureLayerTilingSet::CleanUpTilings( |
+ float min_acceptable_high_res_scale, |
+ float max_acceptable_high_res_scale, |
+ const std::vector<PictureLayerTiling*>& needed_tilings, |
+ bool should_have_low_res, |
+ PictureLayerTilingSet* twin_set, |
+ PictureLayerTilingSet* recycled_twin_set) { |
+ float twin_low_res_scale = 0.f; |
+ if (twin_set) { |
+ PictureLayerTiling* tiling = |
+ twin_set->FindTilingWithResolution(LOW_RESOLUTION); |
+ if (tiling) |
+ twin_low_res_scale = tiling->contents_scale(); |
+ } |
+ |
+ std::vector<PictureLayerTiling*> to_remove; |
+ for (auto* tiling : tilings_) { |
+ // Keep all tilings within the min/max scales. |
+ if (tiling->contents_scale() >= min_acceptable_high_res_scale && |
+ tiling->contents_scale() <= max_acceptable_high_res_scale) { |
+ continue; |
+ } |
+ |
+ // Keep low resolution tilings, if the tiling set should have them. |
+ if (should_have_low_res && |
+ (tiling->resolution() == LOW_RESOLUTION || |
+ tiling->contents_scale() == twin_low_res_scale)) { |
+ continue; |
+ } |
+ |
+ // Don't remove tilings that are required. |
+ if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling) != |
+ needed_tilings.end()) { |
+ continue; |
+ } |
+ |
+ to_remove.push_back(tiling); |
+ } |
+ |
+ 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()) |
+ : nullptr; |
+ // Remove the tiling from the recycle tree. Note that we ignore resolution, |
+ // since we don't need to maintain high/low res on the recycle set. |
+ if (recycled_twin_tiling) |
+ recycled_twin_set->Remove(recycled_twin_tiling); |
+ |
+ DCHECK_NE(HIGH_RESOLUTION, tiling->resolution()); |
+ Remove(tiling); |
+ } |
+} |
+ |
void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { |
for (auto* tiling : tilings_) |
tiling->set_resolution(NON_IDEAL_RESOLUTION); |
@@ -171,16 +234,6 @@ void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { |
tilings_.erase(iter); |
} |
-void PictureLayerTilingSet::RemoveTilingWithScale(float scale) { |
- auto iter = std::find_if(tilings_.begin(), tilings_.end(), |
- [scale](const PictureLayerTiling* tiling) { |
- return tiling->contents_scale() == scale; |
- }); |
- if (iter == tilings_.end()) |
- return; |
- tilings_.erase(iter); |
-} |
- |
void PictureLayerTilingSet::RemoveAllTiles() { |
for (size_t i = 0; i < tilings_.size(); ++i) |
tilings_[i]->Reset(); |