| Index: cc/resources/picture_layer_tiling.h
 | 
| diff --git a/cc/resources/picture_layer_tiling.h b/cc/resources/picture_layer_tiling.h
 | 
| index dae62723711ee741adfe368e43ecc700afe137d3..15c68c0dfd9bbabbab640619fe6b0176e53d06cd 100644
 | 
| --- a/cc/resources/picture_layer_tiling.h
 | 
| +++ b/cc/resources/picture_layer_tiling.h
 | 
| @@ -15,6 +15,7 @@
 | 
|  #include "cc/base/region.h"
 | 
|  #include "cc/base/tiling_data.h"
 | 
|  #include "cc/resources/tile.h"
 | 
| +#include "cc/resources/tile_bundle.h"
 | 
|  #include "cc/resources/tile_priority.h"
 | 
|  #include "ui/gfx/rect.h"
 | 
|  
 | 
| @@ -29,12 +30,15 @@ class CC_EXPORT PictureLayerTilingClient {
 | 
|    virtual scoped_refptr<Tile> CreateTile(
 | 
|      PictureLayerTiling* tiling,
 | 
|      gfx::Rect content_rect) = 0;
 | 
| +  virtual scoped_refptr<TileBundle> CreateTileBundle(gfx::Rect bundle_rect) = 0;
 | 
|    virtual void UpdatePile(Tile* tile) = 0;
 | 
|    virtual gfx::Size CalculateTileSize(
 | 
|      gfx::Size content_bounds) const = 0;
 | 
|    virtual const Region* GetInvalidation() = 0;
 | 
|    virtual const PictureLayerTiling* GetTwinTiling(
 | 
|        const PictureLayerTiling* tiling) const = 0;
 | 
| +  virtual bool IsActive() const = 0;
 | 
| +  virtual bool IsPending() const = 0;
 | 
|  
 | 
|   protected:
 | 
|    virtual ~PictureLayerTilingClient() {}
 | 
| @@ -66,19 +70,63 @@ class CC_EXPORT PictureLayerTiling {
 | 
|    gfx::Size tile_size() const { return tiling_data_.max_texture_size(); }
 | 
|    float contents_scale() const { return contents_scale_; }
 | 
|  
 | 
| +  Tile* TileAt(WhichTree tree, int, int) const;
 | 
| +
 | 
|    void CreateAllTilesForTesting() {
 | 
| -    SetLiveTilesRect(gfx::Rect(tiling_data_.total_size()));
 | 
| +    SetLiveTilesRect(ACTIVE_TREE, gfx::Rect(tiling_data_.total_size()));
 | 
| +    live_tiles_rect_ = gfx::Rect();
 | 
| +    SetLiveTilesRect(PENDING_TREE, gfx::Rect(tiling_data_.total_size()));
 | 
| +  }
 | 
| +
 | 
| +  void CreateAllPendingTilesForTesting() {
 | 
| +    SetLiveTilesRect(PENDING_TREE, gfx::Rect(tiling_data_.total_size()));
 | 
| +  }
 | 
| +  void CreateAllActiveTilesForTesting() {
 | 
| +    SetLiveTilesRect(ACTIVE_TREE, gfx::Rect(tiling_data_.total_size()));
 | 
|    }
 | 
|  
 | 
|    std::vector<Tile*> AllTilesForTesting() const {
 | 
|      std::vector<Tile*> all_tiles;
 | 
| -    for (TileMap::const_iterator it = tiles_.begin();
 | 
| -         it != tiles_.end(); ++it)
 | 
| -      all_tiles.push_back(it->second.get());
 | 
| +    for (TileBundleMap::const_iterator it = tile_bundles_.begin();
 | 
| +         it != tile_bundles_.end(); ++it) {
 | 
| +      for (TileBundle::Iterator tile_it(it->second.get()); tile_it; ++tile_it)
 | 
| +        all_tiles.push_back(*tile_it);
 | 
| +    }
 | 
|      return all_tiles;
 | 
|    }
 | 
|  
 | 
| -  Tile* TileAt(int i, int j) const;
 | 
| +  std::vector<TileBundle*> AllTileBundlesForTesting() const {
 | 
| +    std::vector<TileBundle*> all_bundles;
 | 
| +    for (TileBundleMap::const_iterator it = tile_bundles_.begin();
 | 
| +         it != tile_bundles_.end(); ++it) {
 | 
| +      all_bundles.push_back(it->second.get());
 | 
| +    }
 | 
| +    return all_bundles;
 | 
| +  }
 | 
| +
 | 
| +  std::vector<Tile*> AllPendingTilesForTesting() const {
 | 
| +    std::vector<Tile*> all_tiles;
 | 
| +    for (TileBundleMap::const_iterator it = tile_bundles_.begin();
 | 
| +         it != tile_bundles_.end(); ++it) {
 | 
| +      for (TileBundle::Iterator tile_it(it->second.get()); tile_it; ++tile_it) {
 | 
| +        if (!tile_it.active_tree_only_tile())
 | 
| +          all_tiles.push_back(*tile_it);
 | 
| +      }
 | 
| +    }
 | 
| +    return all_tiles;
 | 
| +  }
 | 
| +
 | 
| +  std::vector<Tile*> AllActiveTilesForTesting() const {
 | 
| +    std::vector<Tile*> all_tiles;
 | 
| +    for (TileBundleMap::const_iterator it = tile_bundles_.begin();
 | 
| +         it != tile_bundles_.end(); ++it) {
 | 
| +      for (TileBundle::Iterator tile_it(it->second.get()); tile_it; ++tile_it) {
 | 
| +        if (!tile_it.pending_tree_only_tile())
 | 
| +          all_tiles.push_back(*tile_it);
 | 
| +      }
 | 
| +    }
 | 
| +    return all_tiles;
 | 
| +  }
 | 
|  
 | 
|    // Iterate over all tiles to fill content_rect.  Even if tiles are invalid
 | 
|    // (i.e. no valid resource) this tiling should still iterate over them.
 | 
| @@ -106,6 +154,9 @@ class CC_EXPORT PictureLayerTiling {
 | 
|      Tile* operator->() const { return current_tile_; }
 | 
|      Tile* operator*() const { return current_tile_; }
 | 
|  
 | 
| +    TilePriority priority();
 | 
| +    void SetPriorityForTesting(const TilePriority& priority);
 | 
| +
 | 
|      CoverageIterator& operator++();
 | 
|      operator bool() const { return tile_j_ <= bottom_; }
 | 
|  
 | 
| @@ -125,6 +176,7 @@ class CC_EXPORT PictureLayerTiling {
 | 
|      int top_;
 | 
|      int right_;
 | 
|      int bottom_;
 | 
| +    WhichTree tree_;
 | 
|  
 | 
|      friend class PictureLayerTiling;
 | 
|    };
 | 
| @@ -189,14 +241,27 @@ class CC_EXPORT PictureLayerTiling {
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| -  typedef std::pair<int, int> TileMapKey;
 | 
| -  typedef base::hash_map<TileMapKey, scoped_refptr<Tile> > TileMap;
 | 
| +  friend class TileBundle;
 | 
| +
 | 
| +  typedef std::pair<int, int> TileBundleMapKey;
 | 
| +  typedef base::hash_map<TileBundleMapKey, scoped_refptr<TileBundle> >
 | 
| +      TileBundleMap;
 | 
|  
 | 
|    PictureLayerTiling(float contents_scale,
 | 
|                       gfx::Size layer_bounds,
 | 
|                       PictureLayerTilingClient* client);
 | 
| -  void SetLiveTilesRect(gfx::Rect live_tiles_rect);
 | 
| -  void CreateTile(int i, int j, const PictureLayerTiling* twin_tiling);
 | 
| +  void SetLiveTilesRect(WhichTree tree, gfx::Rect live_tiles_rect);
 | 
| +  void CreateTile(WhichTree tree,
 | 
| +                  int i,
 | 
| +                  int j,
 | 
| +                  const PictureLayerTiling* twin_tiling);
 | 
| +  bool RemoveTile(WhichTree tree, int i, int j);
 | 
| +  void RemoveBundleIfEmptyContainingTileAt(int i, int j);
 | 
| +  TileBundle* TileBundleContainingTileAt(int, int) const;
 | 
| +  TileBundle* CreateBundleForTileAt(int,
 | 
| +                                    int,
 | 
| +                                    const PictureLayerTiling* twin_tiling);
 | 
| +  TileBundle* TileBundleAt(int, int) const;
 | 
|  
 | 
|    // Given properties.
 | 
|    float contents_scale_;
 | 
| @@ -206,7 +271,9 @@ class CC_EXPORT PictureLayerTiling {
 | 
|  
 | 
|    // Internal data.
 | 
|    TilingData tiling_data_;
 | 
| -  TileMap tiles_;  // It is not legal to have a NULL tile in the tiles_ map.
 | 
| +  TilingData bundle_tiling_data_;
 | 
| +  TileBundleMap tile_bundles_;  // It is not legal to have a NULL tile in the
 | 
| +                                // tiles_ map.
 | 
|    gfx::Rect live_tiles_rect_;
 | 
|  
 | 
|    // State saved for computing velocities based upon finite differences.
 | 
| 
 |