blob: 5b40945e559a13f670d38bf0e6b11785db55a72c [file] [log] [blame]
Ben Murdochbb1529c2013-08-08 10:24:53 +01001// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/resources/prioritized_tile_set.h"
6
7#include <algorithm>
8
9#include "cc/resources/managed_tile_state.h"
10#include "cc/resources/tile.h"
11
12namespace cc {
13
14class BinComparator {
15 public:
16 bool operator()(const scoped_refptr<Tile>& a,
17 const scoped_refptr<Tile>& b) const {
18 const ManagedTileState& ams = a->managed_state();
19 const ManagedTileState& bms = b->managed_state();
20
21 if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN])
22 return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN];
23
24 if (ams.required_for_activation != bms.required_for_activation)
25 return ams.required_for_activation;
26
27 if (ams.resolution != bms.resolution)
28 return ams.resolution < bms.resolution;
29
30 if (ams.time_to_needed_in_seconds != bms.time_to_needed_in_seconds)
31 return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds;
32
33 if (ams.distance_to_visible_in_pixels !=
34 bms.distance_to_visible_in_pixels) {
35 return ams.distance_to_visible_in_pixels <
36 bms.distance_to_visible_in_pixels;
37 }
38
39 gfx::Rect a_rect = a->content_rect();
40 gfx::Rect b_rect = b->content_rect();
41 if (a_rect.y() != b_rect.y())
42 return a_rect.y() < b_rect.y();
43 return a_rect.x() < b_rect.x();
44 }
45};
46
47namespace {
48
49typedef std::vector<scoped_refptr<Tile> > TileVector;
50
51void SortBinTiles(ManagedTileBin bin, TileVector* tiles) {
52 switch (bin) {
53 case NOW_AND_READY_TO_DRAW_BIN:
54 break;
55 case NOW_BIN:
56 case SOON_BIN:
57 case EVENTUALLY_AND_ACTIVE_BIN:
58 case EVENTUALLY_BIN:
59 case NEVER_AND_ACTIVE_BIN:
60 case NEVER_BIN:
61 std::sort(tiles->begin(), tiles->end(), BinComparator());
62 break;
63 default:
64 NOTREACHED();
65 }
66}
67
68} // namespace
69
70PrioritizedTileSet::PrioritizedTileSet() {}
71
72PrioritizedTileSet::~PrioritizedTileSet() {}
73
74void PrioritizedTileSet::InsertTile(Tile* tile, ManagedTileBin bin) {
75 tiles_[bin].push_back(make_scoped_refptr(tile));
76}
77
78void PrioritizedTileSet::Clear() {
79 for (int bin = 0; bin < NUM_BINS; ++bin)
80 tiles_[bin].clear();
81}
82
83void PrioritizedTileSet::Sort() {
84 for (int bin = 0; bin < NUM_BINS; ++bin)
85 SortBinTiles(static_cast<ManagedTileBin>(bin), &tiles_[bin]);
86}
87
88PrioritizedTileSet::PriorityIterator::PriorityIterator(
89 PrioritizedTileSet* tile_set)
90 : tile_set_(tile_set),
91 current_bin_(NOW_AND_READY_TO_DRAW_BIN),
92 iterator_(tile_set->tiles_[current_bin_].begin()) {
93 if (iterator_ == tile_set_->tiles_[current_bin_].end())
94 AdvanceList();
95}
96
97PrioritizedTileSet::PriorityIterator::~PriorityIterator() {}
98
99PrioritizedTileSet::PriorityIterator&
100PrioritizedTileSet::PriorityIterator::operator++() {
101 // We can't increment past the end of the tiles.
102 DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end());
103
104 ++iterator_;
105 if (iterator_ == tile_set_->tiles_[current_bin_].end())
106 AdvanceList();
107 return *this;
108}
109
110Tile* PrioritizedTileSet::PriorityIterator::operator*() {
111 DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end());
112 return iterator_->get();
113}
114
115void PrioritizedTileSet::PriorityIterator::AdvanceList() {
116 DCHECK(iterator_ == tile_set_->tiles_[current_bin_].end());
117
118 while (current_bin_ != NEVER_BIN) {
119 current_bin_ = static_cast<ManagedTileBin>(current_bin_ + 1);
120 iterator_ = tile_set_->tiles_[current_bin_].begin();
121 if (iterator_ != tile_set_->tiles_[current_bin_].end())
122 break;
123 }
124}
125
126} // namespace cc