blob: ba113df76c4ac09010b72f05c66772e00f82f14c [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_RESOURCES_TILE_BUNDLE_H_
#define CC_RESOURCES_TILE_BUNDLE_H_
#include <utility>
#include <vector>
#include "base/memory/ref_counted.h"
#include "cc/base/ref_counted_managed.h"
#include "cc/resources/tile_priority.h"
namespace cc {
class TileManager;
class Tile;
class PictureLayerTiling;
class CC_EXPORT TileBundle : public RefCountedManaged<TileBundle> {
public:
typedef uint64 Id;
typedef std::vector<scoped_refptr<Tile> > TileVector;
typedef std::vector<TileVector> TileGrid;
inline Id id() const { return id_; }
Tile* TileAt(WhichTree tree, int index_x, int index_y);
bool RemoveTileAt(WhichTree tree, int index_x, int index_y);
void AddTileAt(WhichTree tree,
int index_x,
int index_y,
scoped_refptr<Tile> tile);
bool IsEmpty() const { return conservative_tile_count_ == 0; }
void DidBecomeRecycled();
void DidBecomeActive();
void SetPriority(WhichTree tree, const TilePriority& priority);
TilePriority GetPriority(WhichTree tree) const;
void SwapTilesIfRequired();
class CC_EXPORT Iterator {
public:
explicit Iterator(TileBundle* bundle);
Iterator(TileBundle* bundle, WhichTree tree);
~Iterator();
Iterator& operator++();
inline Tile* operator*() { return current_tile_; }
inline Tile* operator->() { return current_tile_; }
inline operator bool() const {
return index_y_ < bundle_->index_count_y_;
}
inline int index_x() {
return index_x_ + bundle_->index_offset_x_;
}
inline int index_y() {
return index_y_ + bundle_->index_offset_y_;
}
TilePriority priority(WhichTree tree) const {
return bundle_->GetPriority(tree);
}
private:
bool InitializeNewTile();
TileBundle* bundle_;
Tile* current_tile_;
int index_x_;
int index_y_;
WhichTree current_tree_;
WhichTree min_tree_;
WhichTree max_tree_;
};
private:
friend class TileManager;
friend class Iterator;
TileBundle(TileManager* tile_manager,
int offset_x,
int offset_y,
int width,
int height);
~TileBundle();
void UpdateToLocalIndex(int* index_x, int* index_y);
Tile* TileAtLocalIndex(WhichTree tree, int x, int y);
TileManager* tile_manager_;
TileGrid tiles_[NUM_TREES];
int index_offset_x_;
int index_offset_y_;
int index_count_x_;
int index_count_y_;
TilePriority priority_[NUM_TREES];
int conservative_tile_count_;
bool needs_tile_swap_;
Id id_;
static Id s_next_id_;
};
} // namespace cc
#endif // CC_RESOURCES_TILE_BUNDLE_H_