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 060bd27faf081d783381dc09aad68019d7253021..35170a0baf5e54665be05928bf9d26a51579a8e3 100644 |
--- a/cc/resources/picture_layer_tiling_set.cc |
+++ b/cc/resources/picture_layer_tiling_set.cc |
@@ -5,6 +5,7 @@ |
#include "cc/resources/picture_layer_tiling_set.h" |
#include <limits> |
+#include <set> |
namespace cc { |
@@ -17,6 +18,12 @@ class LargestToSmallestScaleFunctor { |
} |
}; |
+inline float LargerRatio(float float1, float float2) { |
+ DCHECK_GT(float1, 0.f); |
+ DCHECK_GT(float2, 0.f); |
+ return float1 > float2 ? float1 / float2 : float2 / float1; |
+} |
+ |
} // namespace |
// static |
@@ -43,6 +50,11 @@ void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { |
tilings_[i]->RemoveTilesInRegion(region); |
} |
+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, |
@@ -58,7 +70,7 @@ bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
// Remove any tilings that aren't in |other| or don't meet the minimum. |
for (size_t i = 0; i < tilings_.size(); ++i) { |
float scale = tilings_[i]->contents_scale(); |
- if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale)) |
+ if (scale >= minimum_contents_scale && !!other.FindTilingWithScale(scale)) |
continue; |
// Swap with the last element and remove it. |
tilings_.swap(tilings_.begin() + i, tilings_.end() - 1); |
@@ -73,7 +85,7 @@ bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
float contents_scale = other.tilings_[i]->contents_scale(); |
if (contents_scale < minimum_contents_scale) |
continue; |
- if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) { |
+ if (PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale)) { |
this_tiling->set_resolution(other.tilings_[i]->resolution()); |
this_tiling->UpdateTilesToCurrentRasterSource( |
@@ -127,7 +139,8 @@ int PictureLayerTilingSet::NumHighResTilings() const { |
return num_high_res; |
} |
-PictureLayerTiling* PictureLayerTilingSet::TilingAtScale(float scale) const { |
+PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale( |
+ float scale) const { |
for (size_t i = 0; i < tilings_.size(); ++i) { |
if (tilings_[i]->contents_scale() == scale) |
return tilings_[i]; |
@@ -135,6 +148,17 @@ PictureLayerTiling* PictureLayerTilingSet::TilingAtScale(float scale) const { |
return NULL; |
} |
+PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( |
+ TileResolution resolution) const { |
+ auto iter = std::find_if(tilings_.begin(), tilings_.end(), |
+ [resolution](const PictureLayerTiling* tiling) { |
+ return tiling->resolution() == resolution; |
+ }); |
+ if (iter == tilings_.end()) |
+ return NULL; |
+ return *iter; |
+} |
+ |
void PictureLayerTilingSet::RemoveAllTilings() { |
tilings_.clear(); |
} |
@@ -147,11 +171,45 @@ 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(); |
} |
+float PictureLayerTilingSet::GetSnappedContentsScale( |
+ float start_scale, |
+ float snap_to_existing_tiling_ratio) const { |
+ // If a tiling exists within the max snapping ratio, snap to its scale. |
+ float snapped_contents_scale = start_scale; |
+ float snapped_ratio = snap_to_existing_tiling_ratio; |
+ for (const auto* tiling : tilings_) { |
+ float tiling_contents_scale = tiling->contents_scale(); |
+ float ratio = LargerRatio(tiling_contents_scale, start_scale); |
+ if (ratio < snapped_ratio) { |
+ snapped_contents_scale = tiling_contents_scale; |
+ snapped_ratio = ratio; |
+ } |
+ } |
+ return snapped_contents_scale; |
+} |
+ |
+float PictureLayerTilingSet::GetMaximumContentsScale() const { |
+ if (tilings_.empty()) |
+ return 0.f; |
+ // The first tiling has the largest contents scale. |
+ return tilings_[0]->contents_scale(); |
+} |
+ |
bool PictureLayerTilingSet::UpdateTilePriorities( |
const gfx::Rect& required_rect_in_layer_space, |
float ideal_contents_scale, |
@@ -181,6 +239,12 @@ bool PictureLayerTilingSet::UpdateTilePriorities( |
return true; |
} |
+void PictureLayerTilingSet::GetAllTilesForTracing( |
+ std::set<const Tile*>* tiles) const { |
+ for (auto* tiling : tilings_) |
+ tiling->GetAllTilesForTracing(tiles); |
+} |
+ |
PictureLayerTilingSet::CoverageIterator::CoverageIterator( |
const PictureLayerTilingSet* set, |
float contents_scale, |