| 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,
|
|
|