diff options
Diffstat (limited to 'cc/layers/picture_layer_impl.cc')
-rw-r--r-- | cc/layers/picture_layer_impl.cc | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 29d84f2..d830590 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) { gfx::Rect rect(visible_content_rect()); @@ -390,8 +388,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(); @@ -487,31 +502,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) { @@ -614,18 +618,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; } |