// 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 #include #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 { public: typedef uint64 Id; typedef std::vector > TileVector; typedef std::vector 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); 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_