1 // 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.
5 #include "cc/resources/prioritized_tile_set.h"
9 #include "cc/resources/managed_tile_state.h"
10 #include "cc/resources/tile.h"
16 bool operator()(const Tile
* a
,
17 const Tile
* b
) const {
18 const ManagedTileState
& ams
= a
->managed_state();
19 const ManagedTileState
& bms
= b
->managed_state();
21 if (ams
.priority_bin
!= bms
.priority_bin
)
22 return ams
.priority_bin
< bms
.priority_bin
;
24 if (ams
.required_for_activation
!= bms
.required_for_activation
)
25 return ams
.required_for_activation
;
27 if (ams
.resolution
!= bms
.resolution
)
28 return ams
.resolution
< bms
.resolution
;
30 if (ams
.distance_to_visible
!= bms
.distance_to_visible
)
31 return ams
.distance_to_visible
< bms
.distance_to_visible
;
33 gfx::Rect a_rect
= a
->content_rect();
34 gfx::Rect b_rect
= b
->content_rect();
35 if (a_rect
.y() != b_rect
.y())
36 return a_rect
.y() < b_rect
.y();
37 return a_rect
.x() < b_rect
.x();
43 bool TilePriorityTieBreaker(const Tile
* tile_i
, const Tile
* tile_j
) {
44 // When two tiles has same priority use Id as tie breaker.
45 return tile_i
->id() < tile_j
->id();
48 typedef std::vector
<Tile
*> TileVector
;
50 void SortBinTiles(ManagedTileBin bin
, TileVector
* tiles
) {
54 case NOW_AND_READY_TO_DRAW_BIN
:
55 std::sort(tiles
->begin(), tiles
->end(), TilePriorityTieBreaker
);
59 case EVENTUALLY_AND_ACTIVE_BIN
:
61 case AT_LAST_AND_ACTIVE_BIN
:
63 std::sort(tiles
->begin(), tiles
->end(), BinComparator());
72 PrioritizedTileSet::PrioritizedTileSet() {
73 for (int bin
= 0; bin
< NUM_BINS
; ++bin
)
74 bin_sorted_
[bin
] = true;
77 PrioritizedTileSet::~PrioritizedTileSet() {}
79 void PrioritizedTileSet::InsertTile(Tile
* tile
, ManagedTileBin bin
) {
80 tiles_
[bin
].push_back(tile
);
81 bin_sorted_
[bin
] = false;
84 void PrioritizedTileSet::Clear() {
85 for (int bin
= 0; bin
< NUM_BINS
; ++bin
) {
87 bin_sorted_
[bin
] = true;
91 bool PrioritizedTileSet::IsEmpty() {
92 for (int bin
= 0; bin
< NUM_BINS
; ++bin
)
93 if (!tiles_
[bin
].empty())
99 void PrioritizedTileSet::SortBinIfNeeded(ManagedTileBin bin
) {
100 if (!bin_sorted_
[bin
]) {
101 SortBinTiles(bin
, &tiles_
[bin
]);
102 bin_sorted_
[bin
] = true;
106 PrioritizedTileSet::Iterator::Iterator(
107 PrioritizedTileSet
* tile_set
, bool use_priority_ordering
)
108 : tile_set_(tile_set
),
109 current_bin_(NOW_AND_READY_TO_DRAW_BIN
),
110 use_priority_ordering_(use_priority_ordering
) {
111 if (use_priority_ordering_
)
112 tile_set_
->SortBinIfNeeded(current_bin_
);
113 iterator_
= tile_set
->tiles_
[current_bin_
].begin();
114 if (iterator_
== tile_set_
->tiles_
[current_bin_
].end())
118 PrioritizedTileSet::Iterator::~Iterator() {}
120 void PrioritizedTileSet::Iterator::DisablePriorityOrdering() {
121 use_priority_ordering_
= false;
124 PrioritizedTileSet::Iterator
&
125 PrioritizedTileSet::Iterator::operator++() {
126 // We can't increment past the end of the tiles.
127 DCHECK(iterator_
!= tile_set_
->tiles_
[current_bin_
].end());
130 if (iterator_
== tile_set_
->tiles_
[current_bin_
].end())
135 Tile
* PrioritizedTileSet::Iterator::operator*() {
136 DCHECK(iterator_
!= tile_set_
->tiles_
[current_bin_
].end());
140 void PrioritizedTileSet::Iterator::AdvanceList() {
141 DCHECK(iterator_
== tile_set_
->tiles_
[current_bin_
].end());
143 while (current_bin_
!= NEVER_BIN
) {
144 current_bin_
= static_cast<ManagedTileBin
>(current_bin_
+ 1);
146 if (use_priority_ordering_
)
147 tile_set_
->SortBinIfNeeded(current_bin_
);
149 iterator_
= tile_set_
->tiles_
[current_bin_
].begin();
150 if (iterator_
!= tile_set_
->tiles_
[current_bin_
].end())