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

Unified Diff: cc/layers/picture_layer_impl.cc

Issue 12865017: Makes tile-creation lazy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressing last round of feedback Created 7 years, 8 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
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layers/picture_layer_impl.cc
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index aa9b7f72b57335932a2c0ed0f72ef99c8b5ead4f..f80243b9f55e148ce46d396f31eccd037ea7ef2e 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -61,8 +61,7 @@ scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl(
void PictureLayerImpl::CreateTilingSet() {
DCHECK(layer_tree_impl()->IsPendingTree());
DCHECK(!tilings_);
- tilings_.reset(new PictureLayerTilingSet(this));
- tilings_->SetLayerBounds(bounds());
+ tilings_.reset(new PictureLayerTilingSet(this, bounds()));
}
void PictureLayerImpl::TransferTilingSet(
@@ -90,7 +89,6 @@ void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
layer_impl->is_using_lcd_text_ = is_using_lcd_text_;
}
-
void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
AppendQuadsData* append_quads_data) {
const gfx::Rect& rect = visible_content_rect();
@@ -386,8 +384,25 @@ void PictureLayerImpl::UpdatePile(Tile* tile) {
tile->set_picture_pile(pile_);
}
+const Region* PictureLayerImpl::GetInvalidation() {
+ return &invalidation_;
+}
+
+const PictureLayerTiling* PictureLayerImpl::GetTwinTiling(
+ const PictureLayerTiling* tiling) {
+
+ const PictureLayerImpl* other_layer = layer_tree_impl()->IsActiveTree() ?
+ PendingTwin() : ActiveTwin();
+ if (!other_layer)
+ return NULL;
+ for (size_t i = 0; i < other_layer->tilings_->num_tilings(); ++i)
+ if (other_layer->tilings_->tiling_at(i)->contents_scale() ==
+ tiling->contents_scale())
+ return other_layer->tilings_->tiling_at(i);
+ return NULL;
+}
+
gfx::Size PictureLayerImpl::CalculateTileSize(
- gfx::Size current_tile_size,
gfx::Size content_bounds) {
if (is_mask_) {
int max_size = layer_tree_impl()->MaxTextureSize();
@@ -476,31 +491,20 @@ void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
}
}
- tilings_->CloneAll(*other->tilings_, invalidation_, MinimumContentsScale());
- DCHECK(bounds() == tilings_->LayerBounds());
+ // Union in the other newly exposed regions as invalid.
+ Region difference_region = Region(gfx::Rect(bounds()));
+ difference_region.Subtract(gfx::Rect(other->bounds()));
+ invalidation_.Union(difference_region);
- // It's a sad but unfortunate fact that PicturePile tiling edges do not line
- // up with PictureLayerTiling edges. Tiles can only be added if they are
- // entirely covered by recordings (that may come from multiple PicturePile
- // tiles). This check happens in this class's CreateTile() call.
- for (int x = 0; x < pile_->num_tiles_x(); ++x) {
- for (int y = 0; y < pile_->num_tiles_y(); ++y) {
- bool previously_had = other->pile_->HasRecordingAt(x, y);
- bool now_has = pile_->HasRecordingAt(x, y);
- if (!now_has || previously_had)
- continue;
- gfx::Rect layer_rect = pile_->tile_bounds(x, y);
- tilings_->CreateTilesFromLayerRect(layer_rect);
- }
- }
+ tilings_->CloneAll(*other->tilings_, MinimumContentsScale());
+ DCHECK(bounds() == tilings_->layer_bounds());
}
void PictureLayerImpl::SyncTiling(
- const PictureLayerTiling* tiling,
- const Region& pending_layer_invalidation) {
+ const PictureLayerTiling* tiling) {
if (!DrawsContent() || tiling->contents_scale() < MinimumContentsScale())
return;
- tilings_->Clone(tiling, pending_layer_invalidation);
+ tilings_->Clone(tiling);
}
void PictureLayerImpl::SetIsMask(bool is_mask) {
@@ -600,18 +604,10 @@ PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) {
const Region& recorded = pile_->recorded_region();
DCHECK(!recorded.IsEmpty());
- for (Region::Iterator iter(recorded); iter.has_rect(); iter.next())
- tiling->CreateTilesFromLayerRect(iter.rect());
-
PictureLayerImpl* twin =
layer_tree_impl()->IsPendingTree() ? ActiveTwin() : PendingTwin();
- if (!twin)
- return tiling;
-
- if (layer_tree_impl()->IsPendingTree())
- twin->SyncTiling(tiling, invalidation_);
- else
- twin->SyncTiling(tiling, twin->invalidation_);
+ if (twin)
+ twin->SyncTiling(tiling);
return tiling;
}
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698