Index: cc/picture_layer_tiling_set.cc |
diff --git a/cc/picture_layer_tiling_set.cc b/cc/picture_layer_tiling_set.cc |
index e4bbd57d8280fbd38d35133db325b92f051e57d0..3ee9107320e23c8843522a4f3d7e205863850708 100644 |
--- a/cc/picture_layer_tiling_set.cc |
+++ b/cc/picture_layer_tiling_set.cc |
@@ -6,6 +6,18 @@ |
namespace cc { |
+namespace { |
+ |
+class LargestToSmallestScaleFunctor { |
+ public: |
+ bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { |
+ return left->contents_scale() > right->contents_scale(); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+ |
PictureLayerTilingSet::PictureLayerTilingSet( |
PictureLayerTilingClient * client) |
: client_(client) { |
@@ -37,6 +49,8 @@ void PictureLayerTilingSet::Clone( |
tilings_.push_back(tiling->Clone()); |
tilings_.back()->SetClient(client_); |
tilings_.back()->Invalidate(invalidation); |
+ |
+ tilings_.sort(LargestToSmallestScaleFunctor()); |
} |
void PictureLayerTilingSet::SetLayerBounds(gfx::Size layer_bounds) { |
@@ -51,27 +65,57 @@ gfx::Size PictureLayerTilingSet::LayerBounds() const { |
return layer_bounds_; |
} |
-const PictureLayerTiling* PictureLayerTilingSet::AddTiling( |
+PictureLayerTiling* PictureLayerTilingSet::AddTiling( |
float contents_scale, |
gfx::Size tile_size) { |
tilings_.push_back(PictureLayerTiling::Create(contents_scale, tile_size)); |
- tilings_.back()->SetClient(client_); |
- tilings_.back()->SetLayerBounds(layer_bounds_); |
- return tilings_.back(); |
+ PictureLayerTiling* appended = tilings_.back(); |
+ appended->SetClient(client_); |
+ appended->SetLayerBounds(layer_bounds_); |
+ |
+ tilings_.sort(LargestToSmallestScaleFunctor()); |
+ return appended; |
+} |
+ |
+void PictureLayerTilingSet::RemoveAllTilings() { |
+ tilings_.clear(); |
} |
-void PictureLayerTilingSet::Reset() { |
+void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { |
+ ScopedPtrVector<PictureLayerTiling>::iterator iter = |
+ std::find(tilings_.begin(), tilings_.end(), tiling); |
+ if (iter == tilings_.end()) |
+ return; |
+ tilings_.erase(iter); |
+} |
+ |
+void PictureLayerTilingSet::RemoveAllTiles() { |
for (size_t i = 0; i < tilings_.size(); ++i) |
tilings_[i]->Reset(); |
} |
-PictureLayerTilingSet::Iterator::Iterator(const PictureLayerTilingSet* set, |
- float contents_scale, |
- gfx::Rect content_rect) |
+PictureLayerTilingSet::Iterator::Iterator( |
+ const PictureLayerTilingSet* set, |
+ float contents_scale, |
+ gfx::Rect content_rect, |
+ float ideal_contents_scale) |
: set_(set), |
contents_scale_(contents_scale), |
+ ideal_contents_scale_(ideal_contents_scale), |
current_tiling_(-1) { |
missing_region_.Union(content_rect); |
+ |
+ for (ideal_tiling_ = 0; |
+ static_cast<size_t>(ideal_tiling_) < set_->tilings_.size(); |
+ ++ideal_tiling_) { |
+ PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_]; |
+ if (tiling->contents_scale() < ideal_contents_scale_) { |
+ if (ideal_tiling_ > 0) |
+ ideal_tiling_--; |
+ break; |
+ } |
+ } |
+ |
++(*this); |
} |
@@ -111,6 +155,30 @@ Tile* PictureLayerTilingSet::Iterator::operator*() const { |
return *tiling_iter_; |
} |
+PictureLayerTiling* PictureLayerTilingSet::Iterator::CurrentTiling() { |
+ if (current_tiling_ < 0) |
+ return NULL; |
+ if (static_cast<size_t>(current_tiling_) >= set_->tilings_.size()) |
+ return NULL; |
+ return set_->tilings_[current_tiling_]; |
+} |
+ |
+int PictureLayerTilingSet::Iterator::NextTiling() const { |
+ // Order returned by this method is: |
+ // 1. Ideal tiling index |
+ // 2. Tiling index < Ideal in decreasing order (higher res than ideal) |
+ // 3. Tiling index > Ideal in increasing order (lower res than ideal) |
+ // 4. Tiling index > tilings.size() (invalid index) |
+ if (current_tiling_ < 0) |
+ return ideal_tiling_; |
+ else if (current_tiling_ > ideal_tiling_) |
+ return current_tiling_ + 1; |
+ else if (current_tiling_) |
+ return current_tiling_ - 1; |
+ else |
+ return ideal_tiling_ + 1; |
+} |
+ |
PictureLayerTilingSet::Iterator& PictureLayerTilingSet::Iterator::operator++() { |
bool first_time = current_tiling_ < 0; |
@@ -133,7 +201,7 @@ PictureLayerTilingSet::Iterator& PictureLayerTilingSet::Iterator::operator++() { |
// tiling and set up to iterate through all of the remaining holes. |
// This will also happen the first time through the loop. |
if (!region_iter_.has_rect()) { |
- current_tiling_++; |
+ current_tiling_ = NextTiling(); |
current_region_.Swap(missing_region_); |
missing_region_.Clear(); |
region_iter_ = Region::Iterator(current_region_); |