Index: cc/resources/picture_layer_tiling.cc |
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc |
index eac7ec4e889ec1d8cfd55df96a6f156a95b4db7b..64661c1a6981eb87541742fd56e69ae43b691ffc 100644 |
--- a/cc/resources/picture_layer_tiling.cc |
+++ b/cc/resources/picture_layer_tiling.cc |
@@ -77,6 +77,10 @@ PictureLayerTiling::PictureLayerTiling(float contents_scale, |
client_(client), |
tiling_data_(gfx::Size(), gfx::Size(), true), |
last_impl_frame_time_in_seconds_(0.0), |
+ has_visible_rect_tiles_(false), |
+ has_skewport_rect_tiles_(false), |
+ has_soon_border_rect_tiles_(false), |
+ has_eventually_rect_tiles_(false), |
eviction_tiles_cache_valid_(false), |
eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { |
gfx::Size content_bounds = |
@@ -489,6 +493,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
// Assign now priority to all visible tiles. |
bool include_borders = true; |
+ has_visible_rect_tiles_ = false; |
for (TilingData::Iterator iter( |
&tiling_data_, visible_rect_in_content_space, include_borders); |
iter; |
@@ -496,6 +501,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
TileMap::iterator find = tiles_.find(iter.index()); |
if (find == tiles_.end()) |
continue; |
+ has_visible_rect_tiles_ = true; |
Tile* tile = find->second.get(); |
tile->SetPriority(tree, now_priority); |
@@ -515,6 +521,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
} |
// Assign soon priority to skewport tiles. |
+ has_skewport_rect_tiles_ = false; |
for (TilingData::DifferenceIterator iter( |
&tiling_data_, skewport, visible_rect_in_content_space); |
iter; |
@@ -522,6 +529,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
TileMap::iterator find = tiles_.find(iter.index()); |
if (find == tiles_.end()) |
continue; |
+ has_skewport_rect_tiles_ = true; |
Tile* tile = find->second.get(); |
gfx::Rect tile_bounds = |
@@ -536,6 +544,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
} |
// Assign eventually priority to interest rect tiles. |
+ has_eventually_rect_tiles_ = false; |
for (TilingData::DifferenceIterator iter( |
&tiling_data_, eventually_rect, skewport); |
iter; |
@@ -543,6 +552,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
TileMap::iterator find = tiles_.find(iter.index()); |
if (find == tiles_.end()) |
continue; |
+ has_eventually_rect_tiles_ = true; |
Tile* tile = find->second.get(); |
gfx::Rect tile_bounds = |
@@ -560,6 +570,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
gfx::Rect soon_border_rect = visible_rect_in_content_space; |
float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale; |
soon_border_rect.Inset(-border, -border, -border, -border); |
+ has_soon_border_rect_tiles_ = false; |
for (TilingData::DifferenceIterator iter( |
&tiling_data_, soon_border_rect, skewport); |
iter; |
@@ -567,6 +578,7 @@ void PictureLayerTiling::UpdateTilePriorities( |
TileMap::iterator find = tiles_.find(iter.index()); |
if (find == tiles_.end()) |
continue; |
+ has_soon_border_rect_tiles_ = true; |
Tile* tile = find->second.get(); |
TilePriority priority(resolution_, |
@@ -839,21 +851,15 @@ PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() |
PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( |
PictureLayerTiling* tiling, |
WhichTree tree) |
- : tiling_(tiling), |
- phase_(VISIBLE_RECT), |
- visible_rect_in_content_space_(tiling_->current_visible_rect_), |
- skewport_in_content_space_(tiling_->current_skewport_rect_), |
- eventually_rect_in_content_space_(tiling_->current_eventually_rect_), |
- soon_border_rect_in_content_space_(tiling_->current_soon_border_rect_), |
- tree_(tree), |
- current_tile_(NULL), |
- visible_iterator_(&tiling->tiling_data_, |
- visible_rect_in_content_space_, |
- true /* include_borders */), |
- spiral_iterator_(&tiling->tiling_data_, |
- skewport_in_content_space_, |
- visible_rect_in_content_space_, |
- visible_rect_in_content_space_) { |
+ : tiling_(tiling), phase_(VISIBLE_RECT), tree_(tree), current_tile_(NULL) { |
+ if (!tiling_->has_visible_rect_tiles_) { |
+ AdvancePhase(); |
+ return; |
+ } |
+ |
+ visible_iterator_ = TilingData::Iterator(&tiling_->tiling_data_, |
+ tiling_->current_visible_rect_, |
+ true /* include_borders */); |
if (!visible_iterator_) { |
AdvancePhase(); |
return; |
@@ -872,19 +878,42 @@ void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { |
do { |
phase_ = static_cast<Phase>(phase_ + 1); |
+ switch (phase_) { |
+ case VISIBLE_RECT: |
+ NOTREACHED(); |
+ return; |
+ case SKEWPORT_RECT: |
+ if (!tiling_->has_skewport_rect_tiles_) |
+ continue; |
+ |
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
+ &tiling_->tiling_data_, |
+ tiling_->current_skewport_rect_, |
+ tiling_->current_visible_rect_, |
+ tiling_->current_visible_rect_); |
+ break; |
+ case SOON_BORDER_RECT: |
+ if (!tiling_->has_soon_border_rect_tiles_) |
+ continue; |
+ |
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
+ &tiling_->tiling_data_, |
+ tiling_->current_soon_border_rect_, |
+ tiling_->current_skewport_rect_, |
+ tiling_->current_visible_rect_); |
+ break; |
+ case EVENTUALLY_RECT: |
+ if (!tiling_->has_eventually_rect_tiles_) { |
+ current_tile_ = NULL; |
+ return; |
+ } |
- if (phase_ == SOON_BORDER_RECT) { |
- spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
- &tiling_->tiling_data_, |
- soon_border_rect_in_content_space_, |
- skewport_in_content_space_, |
- visible_rect_in_content_space_); |
- } else if (phase_ == EVENTUALLY_RECT) { |
- spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
- &tiling_->tiling_data_, |
- eventually_rect_in_content_space_, |
- skewport_in_content_space_, |
- soon_border_rect_in_content_space_); |
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator( |
+ &tiling_->tiling_data_, |
+ tiling_->current_eventually_rect_, |
+ tiling_->current_skewport_rect_, |
+ tiling_->current_soon_border_rect_); |
+ break; |
} |
while (spiral_iterator_) { |