Chromium Code Reviews| Index: cc/resources/picture_pile.cc |
| diff --git a/cc/resources/picture_pile.cc b/cc/resources/picture_pile.cc |
| index 4858d247bab590dd766b50e054bb07340e3bf4ea..1b6a50cdc6b7e4ea7fbe52e45e9d999e73a1f8db 100644 |
| --- a/cc/resources/picture_pile.cc |
| +++ b/cc/resources/picture_pile.cc |
| @@ -378,46 +378,56 @@ bool PicturePile::UpdateAndExpandInvalidation( |
| } |
| } |
| - Region invalidation_expanded_to_full_tiles; |
| - for (Region::Iterator i(*invalidation); i.has_rect(); i.next()) { |
| - gfx::Rect invalid_rect = i.rect(); |
| - |
| + // Detect cases where the full pile is invalidated, in this situation we |
| + // can just drop/invalidate everything. |
| + if (invalidation->Contains(gfx::Rect(old_tiling_size)) || |
| + invalidation->Contains(gfx::Rect(tiling_size()))) { |
| + for (auto& it : picture_map_) |
| + updated = it.second.Invalidate(frame_number) || updated; |
|
enne (OOO)
2014/10/11 00:26:33
Oh, right. I forgot can't just drop tiles because
|
| + } else { |
| // Expand invalidation that is outside tiles that intersect the interest |
| // rect. These tiles are no longer valid and should be considerered fully |
| // invalid, so we can know to not keep around raster tiles that intersect |
| // with these recording tiles. |
| - gfx::Rect invalid_rect_outside_interest_rect_tiles = invalid_rect; |
| - // TODO(danakj): We should have a Rect-subtract-Rect-to-2-rects operator |
| - // instead of using Rect::Subtract which gives you the bounding box of the |
| - // subtraction. |
| - invalid_rect_outside_interest_rect_tiles.Subtract(interest_rect_over_tiles); |
| - invalidation_expanded_to_full_tiles.Union(tiling_.ExpandRectToTileBounds( |
| - invalid_rect_outside_interest_rect_tiles)); |
| - |
| - // Split this inflated invalidation across tile boundaries and apply it |
| - // to all tiles that it touches. |
| - bool include_borders = true; |
| - for (TilingData::Iterator iter(&tiling_, invalid_rect, include_borders); |
| - iter; |
| - ++iter) { |
| - const PictureMapKey& key = iter.index(); |
| - |
| - PictureMap::iterator picture_it = picture_map_.find(key); |
| - if (picture_it == picture_map_.end()) |
| - continue; |
| - |
| - // Inform the grid cell that it has been invalidated in this frame. |
| - updated = picture_it->second.Invalidate(frame_number) || updated; |
| - // Invalidate drops the picture so the whole tile better be invalidated if |
| - // it won't be re-recorded below. |
| - DCHECK_IMPLIES(!tiling_.TileBounds(key.first, key.second) |
| - .Intersects(interest_rect_over_tiles), |
| - invalidation_expanded_to_full_tiles.Contains( |
| - tiling_.TileBounds(key.first, key.second))); |
| + Region invalidation_expanded_to_full_tiles; |
| + |
| + for (Region::Iterator i(*invalidation); i.has_rect(); i.next()) { |
| + gfx::Rect invalid_rect = i.rect(); |
| + |
| + gfx::Rect invalid_rect_outside_interest_rect_tiles = invalid_rect; |
| + // TODO(danakj): We should have a Rect-subtract-Rect-to-2-rects operator |
| + // instead of using Rect::Subtract which gives you the bounding box of the |
| + // subtraction. |
| + invalid_rect_outside_interest_rect_tiles.Subtract( |
| + interest_rect_over_tiles); |
| + invalidation_expanded_to_full_tiles.Union(tiling_.ExpandRectToTileBounds( |
| + invalid_rect_outside_interest_rect_tiles)); |
| + |
| + // Split this inflated invalidation across tile boundaries and apply it |
| + // to all tiles that it touches. |
| + bool include_borders = true; |
| + for (TilingData::Iterator iter(&tiling_, invalid_rect, include_borders); |
| + iter; |
| + ++iter) { |
| + const PictureMapKey& key = iter.index(); |
| + |
| + PictureMap::iterator picture_it = picture_map_.find(key); |
| + if (picture_it == picture_map_.end()) |
| + continue; |
| + |
| + // Inform the grid cell that it has been invalidated in this frame. |
| + updated = picture_it->second.Invalidate(frame_number) || updated; |
| + // Invalidate drops the picture so the whole tile better be invalidated |
| + // if it won't be re-recorded below. |
| + DCHECK_IMPLIES(!tiling_.TileBounds(key.first, key.second) |
| + .Intersects(interest_rect_over_tiles), |
| + invalidation_expanded_to_full_tiles.Contains( |
| + tiling_.TileBounds(key.first, key.second))); |
| + } |
| } |
| + invalidation->Union(invalidation_expanded_to_full_tiles); |
| } |
| - invalidation->Union(invalidation_expanded_to_full_tiles); |
| invalidation->Union(resize_invalidation); |
| // Make a list of all invalid tiles; we will attempt to |