| 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;
 | 
|  }
 | 
| 
 |