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