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)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other,
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        const gfx::Size& new_layer_bounds,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        const Region& layer_invalidation,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        float minimum_contents_scale) {
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (new_layer_bounds.IsEmpty()) {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    RemoveAllTilings();
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layer_bounds_ = new_layer_bounds;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tilings_.reserve(other.tilings_.size());
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Remove any tilings that aren't in |other| or don't meet the minimum.
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < tilings_.size(); ++i) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    float scale = tilings_[i]->contents_scale();
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale))
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Swap with the last element and remove it.
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    tilings_.swap(tilings_.begin() + i, tilings_.end() - 1);
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    tilings_.pop_back();
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    --i;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool have_high_res_tiling = false;
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add any missing tilings from |other| that meet the minimum.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < other.tilings_.size(); ++i) {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float contents_scale = other.tilings_[i]->contents_scale();
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (contents_scale < minimum_contents_scale)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this_tiling->set_resolution(other.tilings_[i]->resolution());
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // These two calls must come before updating the pile, because they may
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // destroy tiles that the new pile cannot raster.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this_tiling->SetLayerBounds(new_layer_bounds);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this_tiling->Invalidate(layer_invalidation);
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this_tiling->UpdateTilesToCurrentPile();
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this_tiling->CreateMissingTilesInLiveTilesRect();
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (this_tiling->resolution() == HIGH_RESOLUTION)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        have_high_res_tiling = true;
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DCHECK(this_tiling->tile_size() ==
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch             client_->CalculateTileSize(this_tiling->TilingRect().size()));
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create(
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        contents_scale,
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new_layer_bounds,
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        client_);
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    new_tiling->set_resolution(other.tilings_[i]->resolution());
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (new_tiling->resolution() == HIGH_RESOLUTION)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      have_high_res_tiling = true;
93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    tilings_.push_back(new_tiling.Pass());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tilings_.sort(LargestToSmallestScaleFunctor());
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layer_bounds_ = new_layer_bounds;
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return have_high_res_tiling;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) {
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < tilings_.size(); ++i)
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    tilings_[i]->RemoveTilesInRegion(region);
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTiling* PictureLayerTilingSet::AddTiling(float contents_scale) {
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i)
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK_NE(tilings_[i]->contents_scale(), contents_scale);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tilings_.push_back(PictureLayerTiling::Create(contents_scale,
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                layer_bounds_,
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                client_));
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PictureLayerTiling* appended = tilings_.back();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tilings_.sort(LargestToSmallestScaleFunctor());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return appended;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int PictureLayerTilingSet::NumHighResTilings() const {
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int num_high_res = 0;
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i) {
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (tilings_[i]->resolution() == HIGH_RESOLUTION)
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      num_high_res++;
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return num_high_res;
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPictureLayerTiling* PictureLayerTilingSet::TilingAtScale(float scale) const {
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < tilings_.size(); ++i) {
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (tilings_[i]->contents_scale() == scale)
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return tilings_[i];
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return NULL;
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::RemoveAllTilings() {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tilings_.clear();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedPtrVector<PictureLayerTiling>::iterator iter =
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::find(tilings_.begin(), tilings_.end(), tiling);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (iter == tilings_.end())
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tilings_.erase(iter);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::RemoveAllTiles() {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tilings_[i]->Reset();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::CoverageIterator(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PictureLayerTilingSet* set,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float contents_scale,
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& content_rect,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float ideal_contents_scale)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : set_(set),
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      contents_scale_(contents_scale),
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_contents_scale_(ideal_contents_scale),
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_tiling_(-1) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  missing_region_.Union(content_rect);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ideal_tiling_ = 0;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       static_cast<size_t>(ideal_tiling_) < set_->tilings_.size();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++ideal_tiling_) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_];
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tiling->contents_scale() < ideal_contents_scale_) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (ideal_tiling_ > 0)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ideal_tiling_--;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_LE(set_->tilings_.size(),
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            static_cast<size_t>(std::numeric_limits<int>::max()));
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int num_tilings = set_->tilings_.size();
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (ideal_tiling_ == num_tilings && ideal_tiling_ > 0)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ideal_tiling_--;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++(*this);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::~CoverageIterator() {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect PictureLayerTilingSet::CoverageIterator::geometry_rect() const {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tiling_iter_) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!region_iter_.has_rect())
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return gfx::Rect();
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return region_iter_.rect();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tiling_iter_.geometry_rect();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::RectF PictureLayerTilingSet::CoverageIterator::texture_rect() const {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tiling_iter_)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::RectF();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tiling_iter_.texture_rect();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size PictureLayerTilingSet::CoverageIterator::texture_size() const {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tiling_iter_)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tiling_iter_.texture_size();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Tile* PictureLayerTilingSet::CoverageIterator::operator->() const {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tiling_iter_)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *tiling_iter_;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Tile* PictureLayerTilingSet::CoverageIterator::operator*() const {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tiling_iter_)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *tiling_iter_;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTiling* PictureLayerTilingSet::CoverageIterator::CurrentTiling() {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_tiling_ < 0)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (static_cast<size_t>(current_tiling_) >= set_->tilings_.size())
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return set_->tilings_[current_tiling_];
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int PictureLayerTilingSet::CoverageIterator::NextTiling() const {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Order returned by this method is:
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 1. Ideal tiling index
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 2. Tiling index < Ideal in decreasing order (higher res than ideal)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 3. Tiling index > Ideal in increasing order (lower res than ideal)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 4. Tiling index > tilings.size() (invalid index)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_tiling_ < 0)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ideal_tiling_;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (current_tiling_ > ideal_tiling_)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return current_tiling_ + 1;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (current_tiling_)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return current_tiling_ - 1;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ideal_tiling_ + 1;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator&
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::operator++() {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool first_time = current_tiling_ < 0;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!*this && !first_time)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return *this;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tiling_iter_)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++tiling_iter_;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loop until we find a valid place to stop.
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (true) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (tiling_iter_ &&
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch           (!*tiling_iter_ || !tiling_iter_->IsReadyToDraw())) {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      missing_region_.Union(tiling_iter_.geometry_rect());
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++tiling_iter_;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tiling_iter_)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return *this;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the set of current rects for this tiling is done, go to the next
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tiling and set up to iterate through all of the remaining holes.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This will also happen the first time through the loop.
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!region_iter_.has_rect()) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_tiling_ = NextTiling();
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      current_region_.Swap(&missing_region_);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      missing_region_.Clear();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      region_iter_ = Region::Iterator(current_region_);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // All done and all filled.
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!region_iter_.has_rect()) {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        current_tiling_ = set_->tilings_.size();
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return *this;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // No more valid tiles, return this checkerboard rect.
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (current_tiling_ >= static_cast<int>(set_->tilings_.size()))
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return *this;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Pop a rect off.  If there are no more tilings, then these will be
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // treated as geometry with null tiles that the caller can checkerboard.
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect last_rect = region_iter_.rect();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    region_iter_.next();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Done, found next checkerboard rect to return.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (current_tiling_ >= static_cast<int>(set_->tilings_.size()))
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return *this;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Construct a new iterator for the next tiling, but we need to loop
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // again until we get to a valid one.
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    tiling_iter_ = PictureLayerTiling::CoverageIterator(
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        set_->tilings_[current_tiling_],
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contents_scale_,
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        last_rect);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *this;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PictureLayerTilingSet::CoverageIterator::operator bool() const {
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return current_tiling_ < static_cast<int>(set_->tilings_.size()) ||
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      region_iter_.has_rect();
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PictureLayerTilingSet::DidBecomeActive() {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tilings_[i]->DidBecomeActive();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PictureLayerTilingSet::DidBecomeRecycled() {
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i)
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    tilings_[i]->DidBecomeRecycled();
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> PictureLayerTilingSet::AsValue() const {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> state(new base::ListValue());
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state->Append(tilings_[i]->AsValue().release());
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state.PassAs<base::Value>();
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)size_t PictureLayerTilingSet::GPUMemoryUsageInBytes() const {
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  size_t amount = 0;
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < tilings_.size(); ++i)
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    amount += tilings_[i]->GPUMemoryUsageInBytes();
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return amount;
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
335