| Index: cc/resources/tile_bundle.cc
|
| diff --git a/cc/resources/tile_bundle.cc b/cc/resources/tile_bundle.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..95bc31af6363f7c681b62a9be50dd0a7f7a84636
|
| --- /dev/null
|
| +++ b/cc/resources/tile_bundle.cc
|
| @@ -0,0 +1,181 @@
|
| +// 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.
|
| +
|
| +#include "cc/resources/tile_bundle.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "cc/resources/picture_layer_tiling.h"
|
| +#include "cc/resources/tile.h"
|
| +#include "cc/resources/tile_manager.h"
|
| +
|
| +namespace cc {
|
| +
|
| +TileBundle::Id TileBundle::s_next_id_ = 0;
|
| +
|
| +TileBundle::TileBundle(TileManager* tile_manager,
|
| + int offset_x,
|
| + int offset_y,
|
| + int width,
|
| + int height)
|
| + : RefCountedManaged<TileBundle>(tile_manager),
|
| + tile_manager_(tile_manager),
|
| + offset_x_(offset_x),
|
| + offset_y_(offset_y),
|
| + width_(width),
|
| + height_(height),
|
| + conservative_count_(0u),
|
| + needs_tile_swap_(false),
|
| + id_(s_next_id_++) {
|
| + tiles_[ACTIVE_TREE].resize(height_);
|
| + for (int i = 0; i < height_; ++i)
|
| + tiles_[ACTIVE_TREE][i].resize(width_);
|
| +
|
| + tiles_[PENDING_TREE].resize(height_);
|
| + for (int i = 0; i < height_; ++i)
|
| + tiles_[PENDING_TREE][i].resize(width_);
|
| +}
|
| +
|
| +TileBundle::~TileBundle() {}
|
| +
|
| +Tile* TileBundle::TileAt(WhichTree tree, int index_x, int index_y) {
|
| + DCHECK(!needs_tile_swap_);
|
| +
|
| + UpdateToLocalIndex(&index_x, &index_y);
|
| + return TileAtLocalIndex(tree, index_x, index_y);
|
| +}
|
| +
|
| +Tile* TileBundle::TileAtLocalIndex(WhichTree tree, int index_x, int index_y) {
|
| + return tiles_[tree][index_y][index_x].get();
|
| +}
|
| +
|
| +void TileBundle::SetPriority(WhichTree tree, const TilePriority& priority) {
|
| + DCHECK(!needs_tile_swap_);
|
| +
|
| + if (priority_[tree] == priority)
|
| + return;
|
| +
|
| + priority_[tree] = priority;
|
| + tile_manager_->DidChangeTileBundlePriority(this);
|
| +}
|
| +
|
| +TilePriority TileBundle::GetPriority(WhichTree tree) const {
|
| + return priority_[tree];
|
| +}
|
| +
|
| +bool TileBundle::RemoveTileAt(WhichTree tree, int index_x, int index_y) {
|
| + DCHECK(!needs_tile_swap_);
|
| +
|
| + UpdateToLocalIndex(&index_x, &index_y);
|
| + bool removed = !!tiles_[tree][index_y][index_x];
|
| + tiles_[tree][index_y][index_x] = NULL;
|
| + if (removed)
|
| + --conservative_count_;
|
| + return removed;
|
| +}
|
| +
|
| +void TileBundle::AddTileAt(WhichTree tree,
|
| + int index_x,
|
| + int index_y,
|
| + scoped_refptr<Tile> tile) {
|
| + DCHECK(!needs_tile_swap_);
|
| +
|
| + UpdateToLocalIndex(&index_x, &index_y);
|
| + DCHECK(!tiles_[tree][index_y][index_x]);
|
| + tiles_[tree][index_y][index_x] = tile;
|
| + ++conservative_count_;
|
| +}
|
| +
|
| +void TileBundle::DidBecomeRecycled() {
|
| + priority_[ACTIVE_TREE] = TilePriority();
|
| + needs_tile_swap_ = !needs_tile_swap_;
|
| +}
|
| +
|
| +void TileBundle::DidBecomeActive() {
|
| + priority_[ACTIVE_TREE] = priority_[PENDING_TREE];
|
| + priority_[PENDING_TREE] = TilePriority();
|
| + tiles_[ACTIVE_TREE].swap(tiles_[PENDING_TREE]);
|
| + needs_tile_swap_ = false;
|
| +}
|
| +
|
| +void TileBundle::UpdateToLocalIndex(int* index_x, int* index_y) {
|
| + DCHECK(index_x);
|
| + DCHECK(index_y);
|
| +
|
| + *index_x -= offset_x_;
|
| + *index_y -= offset_y_;
|
| +
|
| + DCHECK_GE(*index_x, 0);
|
| + DCHECK_GE(*index_y, 0);
|
| + DCHECK_LT(*index_x, width_);
|
| + DCHECK_LT(*index_x, height_);
|
| +}
|
| +
|
| +void TileBundle::SwapTilesIfRequired() {
|
| + if (!needs_tile_swap_)
|
| + return;
|
| +
|
| + std::swap(priority_[ACTIVE_TREE], priority_[PENDING_TREE]);
|
| + tiles_[ACTIVE_TREE].swap(tiles_[PENDING_TREE]);
|
| + needs_tile_swap_ = false;
|
| +}
|
| +
|
| +TileBundle::Iterator::Iterator(TileBundle* bundle)
|
| + : bundle_(bundle),
|
| + current_tile_(NULL),
|
| + index_x_(0),
|
| + index_y_(0),
|
| + current_tree_(ACTIVE_TREE) {
|
| + trees_to_iterate_.push_back(ACTIVE_TREE);
|
| + trees_to_iterate_.push_back(PENDING_TREE);
|
| + if (!InitializeNewTileForTree(trees_to_iterate_[0]))
|
| + ++(*this);
|
| +}
|
| +
|
| +TileBundle::Iterator::Iterator(TileBundle* bundle, WhichTree tree)
|
| + : bundle_(bundle),
|
| + current_tile_(NULL),
|
| + index_x_(0),
|
| + index_y_(0),
|
| + current_tree_(tree) {
|
| + trees_to_iterate_.push_back(tree);
|
| + if (!InitializeNewTileForTree(trees_to_iterate_[0]))
|
| + ++(*this);
|
| +}
|
| +
|
| +TileBundle::Iterator::~Iterator() {}
|
| +
|
| +TileBundle::Iterator& TileBundle::Iterator::operator++() {
|
| + DCHECK_GT(trees_to_iterate_.size(), 0u);
|
| + DCHECK_LE(trees_to_iterate_.size(), 2u);
|
| +
|
| + if (current_tree_ == trees_to_iterate_[0] &&
|
| + trees_to_iterate_.size() > 1 &&
|
| + InitializeNewTileForTree(trees_to_iterate_[1]))
|
| + return *this;
|
| +
|
| + do {
|
| + ++index_x_;
|
| + if (index_x_ >= bundle_->width_) {
|
| + index_x_ = 0;
|
| + ++index_y_;
|
| + }
|
| + } while (index_y_ < bundle_->height_ &&
|
| + !InitializeNewTileForTree(trees_to_iterate_[0]) &&
|
| + (trees_to_iterate_.size() == 1 ||
|
| + !InitializeNewTileForTree(trees_to_iterate_[1])));
|
| + return *this;
|
| +}
|
| +
|
| +bool TileBundle::Iterator::InitializeNewTileForTree(WhichTree tree) {
|
| + Tile* tile = bundle_->TileAtLocalIndex(tree, index_x_, index_y_);
|
| + if (!tile || tile == current_tile_)
|
| + return false;
|
| +
|
| + current_tree_ = tree;
|
| + current_tile_ = tile;
|
| + return true;
|
| +}
|
| +
|
| +} // namespace cc
|
|
|