Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5256)

Unified Diff: cc/picture_layer_tiling_set.cc

Issue 11704002: cc: Generate tilings at other scales for impl-side painting (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);

Powered by Google App Engine
This is Rietveld 408576698