picture_layer_tiling_set.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_layer_tiling_set.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <limits> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LargestToSmallestScaleFunctor { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return left->contents_scale() > right->contents_scale(); 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PictureLayerTilingSet::PictureLayerTilingSet( 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PictureLayerTilingClient* client, 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& layer_bounds) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : client_(client), 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_bounds_(layer_bounds) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PictureLayerTilingSet::~PictureLayerTilingSet() { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_ = client; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_[i]->SetClient(client_); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PictureLayerTilingSet::SyncTilings( 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PictureLayerTilingSet& other, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& new_layer_bounds, 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Region& layer_invalidation, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float minimum_contents_scale) { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (new_layer_bounds.IsEmpty()) { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RemoveAllTilings(); 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_bounds_ = new_layer_bounds; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_.reserve(other.tilings_.size()); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remove any tilings that aren't in |other| or don't meet the minimum. 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < tilings_.size(); ++i) { 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch float scale = tilings_[i]->contents_scale(); 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale)) 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Swap with the last element and remove it. 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tilings_.swap(tilings_.begin() + i, tilings_.end() - 1); 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tilings_.pop_back(); 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch --i; 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add any missing tilings from |other| that meet the minimum. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < other.tilings_.size(); ++i) { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float contents_scale = other.tilings_[i]->contents_scale(); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (contents_scale < minimum_contents_scale) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) { 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this_tiling->set_resolution(other.tilings_[i]->resolution()); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // These two calls must come before updating the pile, because they may 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // destroy tiles that the new pile cannot raster. 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this_tiling->SetLayerBounds(new_layer_bounds); 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this_tiling->Invalidate(layer_invalidation); 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this_tiling->UpdateTilesToCurrentPile(); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this_tiling->CreateMissingTilesInLiveTilesRect(); 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(this_tiling->tile_size() == 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch client_->CalculateTileSize(this_tiling->TilingRect().size())); 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) contents_scale, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new_layer_bounds, 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) client_); 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new_tiling->set_resolution(other.tilings_[i]->resolution()); 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) tilings_.push_back(new_tiling.Pass()); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_.sort(LargestToSmallestScaleFunctor()); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_bounds_ = new_layer_bounds; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < tilings_.size(); ++i) 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tilings_[i]->RemoveTilesInRegion(region); 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PictureLayerTilingSet::SetCanUseLCDText(bool can_use_lcd_text) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tilings_[i]->SetCanUseLCDText(can_use_lcd_text); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTiling* PictureLayerTilingSet::AddTiling(float contents_scale) { 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < tilings_.size(); ++i) { 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(enne): temporary sanity CHECK for http://crbug.com/358350. 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If a duplicate tiling gets added, then many assumptions in 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // PictureLayerImpl fail. 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_NE(tilings_[i]->contents_scale(), contents_scale); 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tilings_.push_back(PictureLayerTiling::Create(contents_scale, 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_bounds_, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_)); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PictureLayerTiling* appended = tilings_.back(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_.sort(LargestToSmallestScaleFunctor()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return appended; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int PictureLayerTilingSet::NumHighResTilings() const { 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int num_high_res = 0; 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) { 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (tilings_[i]->resolution() == HIGH_RESOLUTION) 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) num_high_res++; 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return num_high_res; 129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPictureLayerTiling* PictureLayerTilingSet::TilingAtScale(float scale) const { 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < tilings_.size(); ++i) { 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (tilings_[i]->contents_scale() == scale) 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tilings_[i]; 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::RemoveAllTilings() { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_.clear(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPtrVector<PictureLayerTiling>::iterator iter = 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::find(tilings_.begin(), tilings_.end(), tiling); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == tilings_.end()) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_.erase(iter); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::RemoveAllTiles() { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_[i]->Reset(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::CoverageIterator( 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PictureLayerTilingSet* set, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float contents_scale, 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& content_rect, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ideal_contents_scale) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : set_(set), 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_scale_(contents_scale), 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ideal_contents_scale_(ideal_contents_scale), 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_tiling_(-1) { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) missing_region_.Union(content_rect); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ideal_tiling_ = 0; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<size_t>(ideal_tiling_) < set_->tilings_.size(); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++ideal_tiling_) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_]; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tiling->contents_scale() < ideal_contents_scale_) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ideal_tiling_ > 0) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ideal_tiling_--; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_LE(set_->tilings_.size(), 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<size_t>(std::numeric_limits<int>::max())); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_tilings = set_->tilings_.size(); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ideal_tiling_ == num_tilings && ideal_tiling_ > 0) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ideal_tiling_--; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++(*this); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::~CoverageIterator() { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect PictureLayerTilingSet::CoverageIterator::geometry_rect() const { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tiling_iter_) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!region_iter_.has_rect()) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Rect(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return region_iter_.rect(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tiling_iter_.geometry_rect(); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::RectF PictureLayerTilingSet::CoverageIterator::texture_rect() const { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tiling_iter_) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::RectF(); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tiling_iter_.texture_rect(); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size PictureLayerTilingSet::CoverageIterator::texture_size() const { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tiling_iter_) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tiling_iter_.texture_size(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Tile* PictureLayerTilingSet::CoverageIterator::operator->() const { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tiling_iter_) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *tiling_iter_; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Tile* PictureLayerTilingSet::CoverageIterator::operator*() const { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!tiling_iter_) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *tiling_iter_; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTiling* PictureLayerTilingSet::CoverageIterator::CurrentTiling() { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_tiling_ < 0) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (static_cast<size_t>(current_tiling_) >= set_->tilings_.size()) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return set_->tilings_[current_tiling_]; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int PictureLayerTilingSet::CoverageIterator::NextTiling() const { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Order returned by this method is: 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1. Ideal tiling index 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2. Tiling index < Ideal in decreasing order (higher res than ideal) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 3. Tiling index > Ideal in increasing order (lower res than ideal) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 4. Tiling index > tilings.size() (invalid index) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_tiling_ < 0) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ideal_tiling_; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (current_tiling_ > ideal_tiling_) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_tiling_ + 1; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (current_tiling_) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_tiling_ - 1; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ideal_tiling_ + 1; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator& 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::operator++() { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool first_time = current_tiling_ < 0; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!*this && !first_time) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tiling_iter_) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++tiling_iter_; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop until we find a valid place to stop. 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (true) { 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (tiling_iter_ && 2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (!*tiling_iter_ || !tiling_iter_->IsReadyToDraw())) { 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) missing_region_.Union(tiling_iter_.geometry_rect()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++tiling_iter_; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tiling_iter_) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the set of current rects for this tiling is done, go to the next 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tiling and set up to iterate through all of the remaining holes. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This will also happen the first time through the loop. 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!region_iter_.has_rect()) { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_tiling_ = NextTiling(); 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_region_.Swap(&missing_region_); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) missing_region_.Clear(); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) region_iter_ = Region::Iterator(current_region_); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All done and all filled. 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!region_iter_.has_rect()) { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_tiling_ = set_->tilings_.size(); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No more valid tiles, return this checkerboard rect. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_tiling_ >= static_cast<int>(set_->tilings_.size())) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pop a rect off. If there are no more tilings, then these will be 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // treated as geometry with null tiles that the caller can checkerboard. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect last_rect = region_iter_.rect(); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) region_iter_.next(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Done, found next checkerboard rect to return. 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_tiling_ >= static_cast<int>(set_->tilings_.size())) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Construct a new iterator for the next tiling, but we need to loop 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // again until we get to a valid one. 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tiling_iter_ = PictureLayerTiling::CoverageIterator( 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_->tilings_[current_tiling_], 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_scale_, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_rect); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::operator bool() const { 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_tiling_ < static_cast<int>(set_->tilings_.size()) || 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) region_iter_.has_rect(); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::UpdateTilePriorities( 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WhichTree tree, 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& visible_content_rect, 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float layer_contents_scale, 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double current_frame_time_in_seconds) { 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect( 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) visible_content_rect, 1.f / layer_contents_scale); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tilings_[i]->UpdateTilePriorities(tree, 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) visible_layer_rect, 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_contents_scale, 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_frame_time_in_seconds); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::DidBecomeActive() { 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tilings_[i]->DidBecomeActive(); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PictureLayerTilingSet::DidBecomeRecycled() { 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tilings_[i]->DidBecomeRecycled(); 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> PictureLayerTilingSet::AsValue() const { 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> state(new base::ListValue()); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state->Append(tilings_[i]->AsValue().release()); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state.PassAs<base::Value>(); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)size_t PictureLayerTilingSet::GPUMemoryUsageInBytes() const { 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t amount = 0; 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < tilings_.size(); ++i) 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) amount += tilings_[i]->GPUMemoryUsageInBytes(); 35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return amount; 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 354