| Index: cc/picture_layer_tiling_set.cc
|
| diff --git a/cc/picture_layer_tiling_set.cc b/cc/picture_layer_tiling_set.cc
|
| index 9edf8479d7352583cc1effdc2e4139d884dcbb6d..3b21af86ceb61eb9cb3896eec0f5237c31d285ca 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_.append(tiling->Clone());
|
| tilings_.last()->SetClient(client_);
|
| tilings_.last()->Invalidate(invalidation);
|
| +
|
| + sort(tilings_.begin(), tilings_.end(), LargestToSmallestScaleFunctor());
|
| }
|
|
|
| void PictureLayerTilingSet::SetLayerBounds(gfx::Size layer_bounds) {
|
| @@ -51,13 +65,29 @@ gfx::Size PictureLayerTilingSet::LayerBounds() const {
|
| return layer_bounds_;
|
| }
|
|
|
| -const PictureLayerTiling* PictureLayerTilingSet::AddTiling(
|
| +PictureLayerTiling* PictureLayerTilingSet::AddTiling(
|
| float contents_scale,
|
| gfx::Size tile_size) {
|
| tilings_.append(PictureLayerTiling::Create(contents_scale, tile_size));
|
| - tilings_.last()->SetClient(client_);
|
| - tilings_.last()->SetLayerBounds(layer_bounds_);
|
| - return tilings_.last();
|
| + PictureLayerTiling* appended = tilings_.last();
|
| + appended->SetClient(client_);
|
| + appended->SetLayerBounds(layer_bounds_);
|
| +
|
| + sort(tilings_.begin(), tilings_.end(), LargestToSmallestScaleFunctor());
|
| + return appended;
|
| +}
|
| +
|
| +void PictureLayerTilingSet::RemoveAll() {
|
| + tilings_.clear();
|
| +}
|
| +
|
| +void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) {
|
| + for (size_t i = 0; i < tilings_.size(); ++i) {
|
| + if (tilings_[i] == tiling) {
|
| + tilings_.remove(i);
|
| + return;
|
| + }
|
| + }
|
| }
|
|
|
| void PictureLayerTilingSet::Reset() {
|
| @@ -65,13 +95,28 @@ void PictureLayerTilingSet::Reset() {
|
| 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;
|
| + 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 +156,25 @@ Tile* PictureLayerTilingSet::Iterator::operator*() const {
|
| return *tiling_iter_;
|
| }
|
|
|
| +PictureLayerTiling* PictureLayerTilingSet::Iterator::CurrentTiling() {
|
| + if (current_tiling_ < 0 || current_tiling_ >= set_->tilings_.size())
|
| + return NULL;
|
| + return set_->tilings_[current_tiling_];
|
| +}
|
| +
|
| +int PictureLayerTilingSet::Iterator::NextTiling() const {
|
| + // Prefer hi-res tiles, but prefer the least hi-res if bigger than ideal,
|
| + // since it won't add any additional fidelity on screen.
|
| + 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 +197,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_);
|
|
|