| Index: cc/resources/tiling_set_raster_queue_all.cc
|
| diff --git a/cc/resources/tiling_set_raster_queue_all.cc b/cc/resources/tiling_set_raster_queue_all.cc
|
| index c4d949cb75ae3e164f90028411216c423ea8abe1..2ccba67eeb31e637ff39644507d23e1c0bf83d31 100644
|
| --- a/cc/resources/tiling_set_raster_queue_all.cc
|
| +++ b/cc/resources/tiling_set_raster_queue_all.cc
|
| @@ -112,136 +112,222 @@ void TilingSetRasterQueueAll::AdvanceToNextStage() {
|
| }
|
| }
|
|
|
| -TilingSetRasterQueueAll::TilingIterator::TilingIterator()
|
| - : tiling_(NULL), current_tile_(NULL) {
|
| +// OnePriorityRectIterator
|
| +TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator()
|
| + : tile_(nullptr), tiling_(nullptr), tiling_data_(nullptr) {
|
| }
|
|
|
| -TilingSetRasterQueueAll::TilingIterator::TilingIterator(
|
| +TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator(
|
| PictureLayerTiling* tiling,
|
| TilingData* tiling_data)
|
| - : tiling_(tiling),
|
| - tiling_data_(tiling_data),
|
| - phase_(VISIBLE_RECT),
|
| - current_tile_(NULL) {
|
| - if (!tiling_->has_visible_rect_tiles()) {
|
| - AdvancePhase();
|
| - return;
|
| + : tile_(nullptr), tiling_(tiling), tiling_data_(tiling_data) {
|
| +}
|
| +
|
| +template <typename TilingIteratorType>
|
| +void TilingSetRasterQueueAll::OnePriorityRectIterator::AdvanceToNextTile(
|
| + TilingIteratorType* iterator) {
|
| + tile_ = nullptr;
|
| + while (!tile_ || !TileNeedsRaster(tile_)) {
|
| + ++(*iterator);
|
| + if (!(*iterator)) {
|
| + tile_ = nullptr;
|
| + return;
|
| + }
|
| + tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y());
|
| }
|
| + tiling_->UpdateTileAndTwinPriority(tile_);
|
| +}
|
| +
|
| +template <typename TilingIteratorType>
|
| +bool TilingSetRasterQueueAll::OnePriorityRectIterator::
|
| + GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) {
|
| + tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y());
|
| + if (!tile_ || !TileNeedsRaster(tile_)) {
|
| + tile_ = nullptr;
|
| + return false;
|
| + }
|
| + tiling_->UpdateTileAndTwinPriority(tile_);
|
| + return true;
|
| +}
|
|
|
| - visible_iterator_ =
|
| +// VisibleTilingIterator.
|
| +TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator(
|
| + PictureLayerTiling* tiling,
|
| + TilingData* tiling_data)
|
| + : OnePriorityRectIterator(tiling, tiling_data) {
|
| + if (!tiling_->has_visible_rect_tiles())
|
| + return;
|
| + iterator_ =
|
| TilingData::Iterator(tiling_data_, tiling_->current_visible_rect(),
|
| false /* include_borders */);
|
| - if (!visible_iterator_) {
|
| - AdvancePhase();
|
| + if (!iterator_)
|
| return;
|
| - }
|
| + if (!GetFirstTileAndCheckIfValid(&iterator_))
|
| + ++(*this);
|
| +}
|
| +
|
| +TilingSetRasterQueueAll::VisibleTilingIterator&
|
| + TilingSetRasterQueueAll::VisibleTilingIterator::
|
| + operator++() {
|
| + AdvanceToNextTile(&iterator_);
|
| + return *this;
|
| +}
|
|
|
| - current_tile_ =
|
| - tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y());
|
| - if (!current_tile_ || !TileNeedsRaster(current_tile_)) {
|
| +// SkewportTilingIterator.
|
| +TilingSetRasterQueueAll::SkewportTilingIterator::SkewportTilingIterator(
|
| + PictureLayerTiling* tiling,
|
| + TilingData* tiling_data)
|
| + : OnePriorityRectIterator(tiling, tiling_data) {
|
| + if (!tiling_->has_skewport_rect_tiles())
|
| + return;
|
| + iterator_ = TilingData::SpiralDifferenceIterator(
|
| + tiling_data_, tiling_->current_skewport_rect(),
|
| + tiling_->current_visible_rect(), tiling_->current_visible_rect());
|
| + if (!iterator_)
|
| + return;
|
| + if (!GetFirstTileAndCheckIfValid(&iterator_))
|
| ++(*this);
|
| +}
|
| +
|
| +TilingSetRasterQueueAll::SkewportTilingIterator&
|
| + TilingSetRasterQueueAll::SkewportTilingIterator::
|
| + operator++() {
|
| + AdvanceToNextTile(&iterator_);
|
| + return *this;
|
| +}
|
| +
|
| +// SoonBorderTilingIterator.
|
| +TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator(
|
| + PictureLayerTiling* tiling,
|
| + TilingData* tiling_data)
|
| + : OnePriorityRectIterator(tiling, tiling_data) {
|
| + if (!tiling_->has_soon_border_rect_tiles())
|
| return;
|
| - }
|
| - tiling_->UpdateTileAndTwinPriority(current_tile_);
|
| + iterator_ = TilingData::SpiralDifferenceIterator(
|
| + tiling_data_, tiling_->current_soon_border_rect(),
|
| + tiling_->current_skewport_rect(), tiling_->current_visible_rect());
|
| + if (!iterator_)
|
| + return;
|
| + if (!GetFirstTileAndCheckIfValid(&iterator_))
|
| + ++(*this);
|
| }
|
|
|
| -TilingSetRasterQueueAll::TilingIterator::~TilingIterator() {
|
| +TilingSetRasterQueueAll::SoonBorderTilingIterator&
|
| + TilingSetRasterQueueAll::SoonBorderTilingIterator::
|
| + operator++() {
|
| + AdvanceToNextTile(&iterator_);
|
| + return *this;
|
| +}
|
| +
|
| +// EventuallyTilingIterator.
|
| +TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator(
|
| + PictureLayerTiling* tiling,
|
| + TilingData* tiling_data)
|
| + : OnePriorityRectIterator(tiling, tiling_data) {
|
| + if (!tiling_->has_eventually_rect_tiles())
|
| + return;
|
| + iterator_ = TilingData::SpiralDifferenceIterator(
|
| + tiling_data_, tiling_->current_eventually_rect(),
|
| + tiling_->current_skewport_rect(), tiling_->current_soon_border_rect());
|
| + if (!iterator_)
|
| + return;
|
| + if (!GetFirstTileAndCheckIfValid(&iterator_))
|
| + ++(*this);
|
| +}
|
| +
|
| +TilingSetRasterQueueAll::EventuallyTilingIterator&
|
| + TilingSetRasterQueueAll::EventuallyTilingIterator::
|
| + operator++() {
|
| + AdvanceToNextTile(&iterator_);
|
| + return *this;
|
| +}
|
| +
|
| +// TilingIterator
|
| +TilingSetRasterQueueAll::TilingIterator::TilingIterator()
|
| + : tiling_(NULL), current_tile_(NULL) {
|
| +}
|
| +
|
| +TilingSetRasterQueueAll::TilingIterator::TilingIterator(
|
| + PictureLayerTiling* tiling,
|
| + TilingData* tiling_data)
|
| + : tiling_(tiling),
|
| + tiling_data_(tiling_data),
|
| + phase_(VISIBLE_RECT),
|
| + current_tile_(NULL) {
|
| + visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_);
|
| + if (visible_iterator_.done()) {
|
| + AdvancePhase();
|
| + return;
|
| + }
|
| + current_tile_ = *visible_iterator_;
|
| }
|
|
|
| void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() {
|
| DCHECK_LT(phase_, EVENTUALLY_RECT);
|
|
|
| - do {
|
| + current_tile_ = nullptr;
|
| + while (!current_tile_ && phase_ < EVENTUALLY_RECT) {
|
| phase_ = static_cast<Phase>(phase_ + 1);
|
| switch (phase_) {
|
| case VISIBLE_RECT:
|
| NOTREACHED();
|
| return;
|
| case SKEWPORT_RECT:
|
| - if (!tiling_->has_skewport_rect_tiles())
|
| - continue;
|
| -
|
| - spiral_iterator_ = TilingData::SpiralDifferenceIterator(
|
| - tiling_data_, tiling_->current_skewport_rect(),
|
| - tiling_->current_visible_rect(), tiling_->current_visible_rect());
|
| + skewport_iterator_ = SkewportTilingIterator(tiling_, tiling_data_);
|
| + if (!skewport_iterator_.done())
|
| + current_tile_ = *skewport_iterator_;
|
| break;
|
| case SOON_BORDER_RECT:
|
| - if (!tiling_->has_soon_border_rect_tiles())
|
| - continue;
|
| -
|
| - spiral_iterator_ = TilingData::SpiralDifferenceIterator(
|
| - tiling_data_, tiling_->current_soon_border_rect(),
|
| - tiling_->current_skewport_rect(), tiling_->current_visible_rect());
|
| + soon_border_iterator_ = SoonBorderTilingIterator(tiling_, tiling_data_);
|
| + if (!soon_border_iterator_.done())
|
| + current_tile_ = *soon_border_iterator_;
|
| break;
|
| case EVENTUALLY_RECT:
|
| - if (!tiling_->has_eventually_rect_tiles()) {
|
| - current_tile_ = NULL;
|
| - return;
|
| - }
|
| -
|
| - spiral_iterator_ = TilingData::SpiralDifferenceIterator(
|
| - tiling_data_, tiling_->current_eventually_rect(),
|
| - tiling_->current_skewport_rect(),
|
| - tiling_->current_soon_border_rect());
|
| - break;
|
| - }
|
| -
|
| - while (spiral_iterator_) {
|
| - current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(),
|
| - spiral_iterator_.index_y());
|
| - if (current_tile_ && TileNeedsRaster(current_tile_))
|
| + eventually_iterator_ = EventuallyTilingIterator(tiling_, tiling_data_);
|
| + if (!eventually_iterator_.done())
|
| + current_tile_ = *eventually_iterator_;
|
| break;
|
| - ++spiral_iterator_;
|
| - }
|
| -
|
| - if (!spiral_iterator_ && phase_ == EVENTUALLY_RECT) {
|
| - current_tile_ = NULL;
|
| - break;
|
| }
|
| - } while (!spiral_iterator_);
|
| -
|
| - if (current_tile_)
|
| - tiling_->UpdateTileAndTwinPriority(current_tile_);
|
| + }
|
| }
|
|
|
| TilingSetRasterQueueAll::TilingIterator&
|
| TilingSetRasterQueueAll::TilingIterator::
|
| operator++() {
|
| - current_tile_ = NULL;
|
| - while (!current_tile_ || !TileNeedsRaster(current_tile_)) {
|
| - std::pair<int, int> next_index;
|
| - switch (phase_) {
|
| - case VISIBLE_RECT:
|
| - ++visible_iterator_;
|
| - if (!visible_iterator_) {
|
| - AdvancePhase();
|
| - return *this;
|
| - }
|
| - next_index = visible_iterator_.index();
|
| - break;
|
| - case SKEWPORT_RECT:
|
| - case SOON_BORDER_RECT:
|
| - ++spiral_iterator_;
|
| - if (!spiral_iterator_) {
|
| - AdvancePhase();
|
| - return *this;
|
| - }
|
| - next_index = spiral_iterator_.index();
|
| - break;
|
| - case EVENTUALLY_RECT:
|
| - ++spiral_iterator_;
|
| - if (!spiral_iterator_) {
|
| - current_tile_ = NULL;
|
| - return *this;
|
| - }
|
| - next_index = spiral_iterator_.index();
|
| - break;
|
| - }
|
| - current_tile_ = tiling_->TileAt(next_index.first, next_index.second);
|
| + switch (phase_) {
|
| + case VISIBLE_RECT:
|
| + ++visible_iterator_;
|
| + if (visible_iterator_.done()) {
|
| + AdvancePhase();
|
| + return *this;
|
| + }
|
| + current_tile_ = *visible_iterator_;
|
| + break;
|
| + case SKEWPORT_RECT:
|
| + ++skewport_iterator_;
|
| + if (skewport_iterator_.done()) {
|
| + AdvancePhase();
|
| + return *this;
|
| + }
|
| + current_tile_ = *skewport_iterator_;
|
| + break;
|
| + case SOON_BORDER_RECT:
|
| + ++soon_border_iterator_;
|
| + if (soon_border_iterator_.done()) {
|
| + AdvancePhase();
|
| + return *this;
|
| + }
|
| + current_tile_ = *soon_border_iterator_;
|
| + break;
|
| + case EVENTUALLY_RECT:
|
| + ++eventually_iterator_;
|
| + if (eventually_iterator_.done()) {
|
| + current_tile_ = nullptr;
|
| + return *this;
|
| + }
|
| + current_tile_ = *eventually_iterator_;
|
| + break;
|
| }
|
| -
|
| - if (current_tile_)
|
| - tiling_->UpdateTileAndTwinPriority(current_tile_);
|
| return *this;
|
| }
|
|
|
|
|