Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(367)

Side by Side Diff: cc/resources/tiling_set_raster_queue_all.cc

Issue 1051993002: cc: Remove tile sharing from tilings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixes Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/tiling_set_raster_queue_all.h" 5 #include "cc/resources/tiling_set_raster_queue_all.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "cc/resources/picture_layer_tiling_set.h" 9 #include "cc/resources/picture_layer_tiling_set.h"
10 #include "cc/resources/tile.h" 10 #include "cc/resources/tile.h"
11 #include "cc/resources/tile_priority.h" 11 #include "cc/resources/tile_priority.h"
12 12
13 namespace cc { 13 namespace cc {
14 14
15 TilingSetRasterQueueAll::IterationStage::IterationStage(
16 IteratorType type,
17 TilePriority::PriorityBin bin)
18 : iterator_type(type), tile_type(bin) {
19 }
20
15 TilingSetRasterQueueAll::TilingSetRasterQueueAll( 21 TilingSetRasterQueueAll::TilingSetRasterQueueAll(
16 PictureLayerTilingSet* tiling_set, 22 PictureLayerTilingSet* tiling_set,
17 bool prioritize_low_res) 23 bool prioritize_low_res)
18 : tiling_set_(tiling_set), current_stage_(0) { 24 : tiling_set_(tiling_set), current_stage_(0) {
19 DCHECK(tiling_set_); 25 DCHECK(tiling_set_);
20 26
21 // Early out if the tiling set has no tilings. 27 // Early out if the tiling set has no tilings.
22 if (!tiling_set_->num_tilings()) { 28 if (!tiling_set_->num_tilings())
23 current_stage_ = arraysize(stages_);
24 return; 29 return;
25 }
26 30
31 const PictureLayerTilingClient* client = tiling_set->client();
32 WhichTree tree = client->GetTree();
27 // Find high and low res tilings and initialize the iterators. 33 // Find high and low res tilings and initialize the iterators.
34 PictureLayerTiling* high_res_tiling = nullptr;
35 PictureLayerTiling* low_res_tiling = nullptr;
36 // This variable would point to a tiling that has a NON_IDEAL_RESOLUTION
37 // resolution on the active tree, but HIGH_RESOLUTION on the pending tree.
38 // These tilings are the only non-ideal tilings that could have required for
39 // activation tiles, so they need to be considered for rasterization.
40 PictureLayerTiling* active_non_ideal_pending_high_res_tiling = nullptr;
28 for (size_t i = 0; i < tiling_set_->num_tilings(); ++i) { 41 for (size_t i = 0; i < tiling_set_->num_tilings(); ++i) {
29 PictureLayerTiling* tiling = tiling_set_->tiling_at(i); 42 PictureLayerTiling* tiling = tiling_set_->tiling_at(i);
30 if (tiling->resolution() == HIGH_RESOLUTION) 43 if (tiling->resolution() == HIGH_RESOLUTION)
31 iterators_[HIGH_RES] = TilingIterator(tiling, &tiling->tiling_data_); 44 high_res_tiling = tiling;
32 if (prioritize_low_res && tiling->resolution() == LOW_RESOLUTION) 45 if (prioritize_low_res && tiling->resolution() == LOW_RESOLUTION)
33 iterators_[LOW_RES] = TilingIterator(tiling, &tiling->tiling_data_); 46 low_res_tiling = tiling;
47 if (tree == ACTIVE_TREE && tiling->resolution() == NON_IDEAL_RESOLUTION) {
48 const PictureLayerTiling* twin =
49 client->GetPendingOrActiveTwinTiling(tiling);
50 if (twin && twin->resolution() == HIGH_RESOLUTION)
51 active_non_ideal_pending_high_res_tiling = tiling;
52 }
34 } 53 }
35 54
36 if (prioritize_low_res) { 55 bool use_low_res_tiling = low_res_tiling && low_res_tiling->has_tiles();
37 stages_[0].iterator_type = LOW_RES; 56 if (use_low_res_tiling && prioritize_low_res) {
38 stages_[0].tile_type = TilePriority::NOW; 57 iterators_[LOW_RES] =
39 58 TilingIterator(low_res_tiling, &low_res_tiling->tiling_data_);
40 stages_[1].iterator_type = HIGH_RES; 59 stages_->push_back(IterationStage(LOW_RES, TilePriority::NOW));
41 stages_[1].tile_type = TilePriority::NOW;
42 } else {
43 stages_[0].iterator_type = HIGH_RES;
44 stages_[0].tile_type = TilePriority::NOW;
45
46 stages_[1].iterator_type = LOW_RES;
47 stages_[1].tile_type = TilePriority::NOW;
48 } 60 }
49 61
50 stages_[2].iterator_type = HIGH_RES; 62 bool use_high_res_tiling = high_res_tiling && high_res_tiling->has_tiles();
vmpstr 2015/04/28 19:06:04 This is a fix for crbug.com/481509
51 stages_[2].tile_type = TilePriority::SOON; 63 if (use_high_res_tiling) {
64 iterators_[HIGH_RES] =
65 TilingIterator(high_res_tiling, &high_res_tiling->tiling_data_);
66 stages_->push_back(IterationStage(HIGH_RES, TilePriority::NOW));
67 }
52 68
53 stages_[3].iterator_type = HIGH_RES; 69 if (low_res_tiling && !prioritize_low_res) {
54 stages_[3].tile_type = TilePriority::EVENTUALLY; 70 iterators_[LOW_RES] =
71 TilingIterator(low_res_tiling, &low_res_tiling->tiling_data_);
72 stages_->push_back(IterationStage(LOW_RES, TilePriority::NOW));
73 }
74
75 if (active_non_ideal_pending_high_res_tiling &&
76 active_non_ideal_pending_high_res_tiling->has_tiles()) {
77 iterators_[ACTIVE_NON_IDEAL_PENDING_HIGH_RES] =
78 TilingIterator(active_non_ideal_pending_high_res_tiling,
79 &active_non_ideal_pending_high_res_tiling->tiling_data_);
80
81 stages_->push_back(
82 IterationStage(ACTIVE_NON_IDEAL_PENDING_HIGH_RES, TilePriority::NOW));
83 stages_->push_back(
84 IterationStage(ACTIVE_NON_IDEAL_PENDING_HIGH_RES, TilePriority::SOON));
85 }
86
87 if (use_high_res_tiling) {
88 stages_->push_back(IterationStage(HIGH_RES, TilePriority::SOON));
89 stages_->push_back(IterationStage(HIGH_RES, TilePriority::EVENTUALLY));
90 }
91
92 if (stages_->empty())
93 return;
55 94
56 IteratorType index = stages_[current_stage_].iterator_type; 95 IteratorType index = stages_[current_stage_].iterator_type;
57 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; 96 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
58 if (iterators_[index].done() || iterators_[index].type() != tile_type) 97 if (iterators_[index].done() || iterators_[index].type() != tile_type)
59 AdvanceToNextStage(); 98 AdvanceToNextStage();
60 } 99 }
61 100
62 TilingSetRasterQueueAll::~TilingSetRasterQueueAll() { 101 TilingSetRasterQueueAll::~TilingSetRasterQueueAll() {
63 } 102 }
64 103
65 bool TilingSetRasterQueueAll::IsEmpty() const { 104 bool TilingSetRasterQueueAll::IsEmpty() const {
66 return current_stage_ >= arraysize(stages_); 105 return current_stage_ >= stages_->size();
67 } 106 }
68 107
69 void TilingSetRasterQueueAll::Pop() { 108 void TilingSetRasterQueueAll::Pop() {
70 IteratorType index = stages_[current_stage_].iterator_type; 109 IteratorType index = stages_[current_stage_].iterator_type;
71 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; 110 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
72 111
73 // First advance the iterator. 112 // First advance the iterator.
74 DCHECK(!iterators_[index].done()); 113 DCHECK(!iterators_[index].done());
75 DCHECK(iterators_[index].type() == tile_type); 114 DCHECK(iterators_[index].type() == tile_type);
76 ++iterators_[index]; 115 ++iterators_[index];
(...skipping 16 matching lines...) Expand all
93 DCHECK(!IsEmpty()); 132 DCHECK(!IsEmpty());
94 133
95 IteratorType index = stages_[current_stage_].iterator_type; 134 IteratorType index = stages_[current_stage_].iterator_type;
96 DCHECK(!iterators_[index].done()); 135 DCHECK(!iterators_[index].done());
97 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type); 136 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type);
98 137
99 return *iterators_[index]; 138 return *iterators_[index];
100 } 139 }
101 140
102 void TilingSetRasterQueueAll::AdvanceToNextStage() { 141 void TilingSetRasterQueueAll::AdvanceToNextStage() {
103 DCHECK_LT(current_stage_, arraysize(stages_)); 142 DCHECK_LT(current_stage_, stages_->size());
104 ++current_stage_; 143 ++current_stage_;
105 while (current_stage_ < arraysize(stages_)) { 144 while (current_stage_ < stages_->size()) {
106 IteratorType index = stages_[current_stage_].iterator_type; 145 IteratorType index = stages_[current_stage_].iterator_type;
107 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; 146 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
108 147
109 if (!iterators_[index].done() && iterators_[index].type() == tile_type) 148 if (!iterators_[index].done() && iterators_[index].type() == tile_type)
110 break; 149 break;
111 ++current_stage_; 150 ++current_stage_;
112 } 151 }
113 } 152 }
114 153
115 // OnePriorityRectIterator 154 // OnePriorityRectIterator
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 ++(*this); 205 ++(*this);
167 } 206 }
168 207
169 TilingSetRasterQueueAll::VisibleTilingIterator& 208 TilingSetRasterQueueAll::VisibleTilingIterator&
170 TilingSetRasterQueueAll::VisibleTilingIterator:: 209 TilingSetRasterQueueAll::VisibleTilingIterator::
171 operator++() { 210 operator++() {
172 AdvanceToNextTile(&iterator_); 211 AdvanceToNextTile(&iterator_);
173 return *this; 212 return *this;
174 } 213 }
175 214
215 // PendingVisibleTilingIterator.
216 TilingSetRasterQueueAll::PendingVisibleTilingIterator::
217 PendingVisibleTilingIterator(PictureLayerTiling* tiling,
218 TilingData* tiling_data)
219 : OnePriorityRectIterator(tiling, tiling_data) {
220 iterator_ = TilingData::DifferenceIterator(tiling_data_,
221 tiling_->pending_visible_rect(),
222 tiling_->current_visible_rect());
223 if (!iterator_)
224 return;
225 if (!GetFirstTileAndCheckIfValid(&iterator_))
226 ++(*this);
227 }
228
229 TilingSetRasterQueueAll::PendingVisibleTilingIterator&
230 TilingSetRasterQueueAll::PendingVisibleTilingIterator::
231 operator++() {
232 AdvanceToNextTile(&iterator_);
233 return *this;
234 }
235
176 // SkewportTilingIterator. 236 // SkewportTilingIterator.
177 TilingSetRasterQueueAll::SkewportTilingIterator::SkewportTilingIterator( 237 TilingSetRasterQueueAll::SkewportTilingIterator::SkewportTilingIterator(
178 PictureLayerTiling* tiling, 238 PictureLayerTiling* tiling,
179 TilingData* tiling_data) 239 TilingData* tiling_data)
180 : OnePriorityRectIterator(tiling, tiling_data) { 240 : OnePriorityRectIterator(tiling, tiling_data),
241 pending_visible_rect_(tiling->pending_visible_rect()) {
181 if (!tiling_->has_skewport_rect_tiles()) 242 if (!tiling_->has_skewport_rect_tiles())
182 return; 243 return;
183 iterator_ = TilingData::SpiralDifferenceIterator( 244 iterator_ = TilingData::SpiralDifferenceIterator(
184 tiling_data_, tiling_->current_skewport_rect(), 245 tiling_data_, tiling_->current_skewport_rect(),
185 tiling_->current_visible_rect(), tiling_->current_visible_rect()); 246 tiling_->current_visible_rect(), tiling_->current_visible_rect());
186 if (!iterator_) 247 if (!iterator_)
187 return; 248 return;
188 if (!GetFirstTileAndCheckIfValid(&iterator_)) 249 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
250 ++(*this);
251 return;
252 }
253 if (tile_->content_rect().Intersects(pending_visible_rect_))
189 ++(*this); 254 ++(*this);
190 } 255 }
191 256
192 TilingSetRasterQueueAll::SkewportTilingIterator& 257 TilingSetRasterQueueAll::SkewportTilingIterator&
193 TilingSetRasterQueueAll::SkewportTilingIterator:: 258 TilingSetRasterQueueAll::SkewportTilingIterator::
194 operator++() { 259 operator++() {
195 AdvanceToNextTile(&iterator_); 260 AdvanceToNextTile(&iterator_);
261 while (!done()) {
262 if (!tile_->content_rect().Intersects(pending_visible_rect_))
263 break;
264 AdvanceToNextTile(&iterator_);
265 }
196 return *this; 266 return *this;
197 } 267 }
198 268
199 // SoonBorderTilingIterator. 269 // SoonBorderTilingIterator.
200 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator( 270 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator(
201 PictureLayerTiling* tiling, 271 PictureLayerTiling* tiling,
202 TilingData* tiling_data) 272 TilingData* tiling_data)
203 : OnePriorityRectIterator(tiling, tiling_data) { 273 : OnePriorityRectIterator(tiling, tiling_data),
274 pending_visible_rect_(tiling->pending_visible_rect()) {
204 if (!tiling_->has_soon_border_rect_tiles()) 275 if (!tiling_->has_soon_border_rect_tiles())
205 return; 276 return;
206 iterator_ = TilingData::SpiralDifferenceIterator( 277 iterator_ = TilingData::SpiralDifferenceIterator(
207 tiling_data_, tiling_->current_soon_border_rect(), 278 tiling_data_, tiling_->current_soon_border_rect(),
208 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); 279 tiling_->current_skewport_rect(), tiling_->current_visible_rect());
209 if (!iterator_) 280 if (!iterator_)
210 return; 281 return;
211 if (!GetFirstTileAndCheckIfValid(&iterator_)) 282 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
283 ++(*this);
284 return;
285 }
286 if (tile_->content_rect().Intersects(pending_visible_rect_))
212 ++(*this); 287 ++(*this);
213 } 288 }
214 289
215 TilingSetRasterQueueAll::SoonBorderTilingIterator& 290 TilingSetRasterQueueAll::SoonBorderTilingIterator&
216 TilingSetRasterQueueAll::SoonBorderTilingIterator:: 291 TilingSetRasterQueueAll::SoonBorderTilingIterator::
217 operator++() { 292 operator++() {
218 AdvanceToNextTile(&iterator_); 293 AdvanceToNextTile(&iterator_);
294 while (!done()) {
295 if (!tile_->content_rect().Intersects(pending_visible_rect_))
296 break;
297 AdvanceToNextTile(&iterator_);
298 }
219 return *this; 299 return *this;
220 } 300 }
221 301
222 // EventuallyTilingIterator. 302 // EventuallyTilingIterator.
223 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator( 303 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator(
224 PictureLayerTiling* tiling, 304 PictureLayerTiling* tiling,
225 TilingData* tiling_data) 305 TilingData* tiling_data)
226 : OnePriorityRectIterator(tiling, tiling_data) { 306 : OnePriorityRectIterator(tiling, tiling_data),
307 pending_visible_rect_(tiling->pending_visible_rect()) {
227 if (!tiling_->has_eventually_rect_tiles()) 308 if (!tiling_->has_eventually_rect_tiles())
228 return; 309 return;
229 iterator_ = TilingData::SpiralDifferenceIterator( 310 iterator_ = TilingData::SpiralDifferenceIterator(
230 tiling_data_, tiling_->current_eventually_rect(), 311 tiling_data_, tiling_->current_eventually_rect(),
231 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect()); 312 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect());
232 if (!iterator_) 313 if (!iterator_)
233 return; 314 return;
234 if (!GetFirstTileAndCheckIfValid(&iterator_)) 315 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
316 ++(*this);
317 return;
318 }
319 if (tile_->content_rect().Intersects(pending_visible_rect_))
235 ++(*this); 320 ++(*this);
236 } 321 }
237 322
238 TilingSetRasterQueueAll::EventuallyTilingIterator& 323 TilingSetRasterQueueAll::EventuallyTilingIterator&
239 TilingSetRasterQueueAll::EventuallyTilingIterator:: 324 TilingSetRasterQueueAll::EventuallyTilingIterator::
240 operator++() { 325 operator++() {
241 AdvanceToNextTile(&iterator_); 326 AdvanceToNextTile(&iterator_);
327 while (!done()) {
328 if (!tile_->content_rect().Intersects(pending_visible_rect_))
329 break;
330 AdvanceToNextTile(&iterator_);
331 }
242 return *this; 332 return *this;
243 } 333 }
244 334
245 // TilingIterator 335 // TilingIterator
246 TilingSetRasterQueueAll::TilingIterator::TilingIterator() 336 TilingSetRasterQueueAll::TilingIterator::TilingIterator()
247 : tiling_(NULL), current_tile_(NULL) { 337 : tiling_(NULL), current_tile_(NULL) {
248 } 338 }
249 339
250 TilingSetRasterQueueAll::TilingIterator::TilingIterator( 340 TilingSetRasterQueueAll::TilingIterator::TilingIterator(
251 PictureLayerTiling* tiling, 341 PictureLayerTiling* tiling,
252 TilingData* tiling_data) 342 TilingData* tiling_data)
253 : tiling_(tiling), 343 : tiling_(tiling),
254 tiling_data_(tiling_data), 344 tiling_data_(tiling_data),
255 phase_(VISIBLE_RECT), 345 phase_(VISIBLE_RECT),
256 current_tile_(NULL) { 346 current_tile_(NULL) {
257 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_); 347 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_);
258 if (visible_iterator_.done()) { 348 if (visible_iterator_.done()) {
259 AdvancePhase(); 349 AdvancePhase();
260 return; 350 return;
261 } 351 }
262 current_tile_ = *visible_iterator_; 352 current_tile_ = *visible_iterator_;
263 } 353 }
264 354
355 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() {
356 }
357
265 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() { 358 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() {
266 DCHECK_LT(phase_, EVENTUALLY_RECT); 359 DCHECK_LT(phase_, EVENTUALLY_RECT);
267 360
268 current_tile_ = nullptr; 361 current_tile_ = nullptr;
269 while (!current_tile_ && phase_ < EVENTUALLY_RECT) { 362 while (!current_tile_ && phase_ < EVENTUALLY_RECT) {
270 phase_ = static_cast<Phase>(phase_ + 1); 363 phase_ = static_cast<Phase>(phase_ + 1);
271 switch (phase_) { 364 switch (phase_) {
272 case VISIBLE_RECT: 365 case VISIBLE_RECT:
273 NOTREACHED(); 366 NOTREACHED();
274 return; 367 return;
368 case PENDING_VISIBLE_RECT:
369 pending_visible_iterator_ =
370 PendingVisibleTilingIterator(tiling_, tiling_data_);
371 if (!pending_visible_iterator_.done())
372 current_tile_ = *pending_visible_iterator_;
373 break;
275 case SKEWPORT_RECT: 374 case SKEWPORT_RECT:
276 skewport_iterator_ = SkewportTilingIterator(tiling_, tiling_data_); 375 skewport_iterator_ = SkewportTilingIterator(tiling_, tiling_data_);
277 if (!skewport_iterator_.done()) 376 if (!skewport_iterator_.done())
278 current_tile_ = *skewport_iterator_; 377 current_tile_ = *skewport_iterator_;
279 break; 378 break;
280 case SOON_BORDER_RECT: 379 case SOON_BORDER_RECT:
281 soon_border_iterator_ = SoonBorderTilingIterator(tiling_, tiling_data_); 380 soon_border_iterator_ = SoonBorderTilingIterator(tiling_, tiling_data_);
282 if (!soon_border_iterator_.done()) 381 if (!soon_border_iterator_.done())
283 current_tile_ = *soon_border_iterator_; 382 current_tile_ = *soon_border_iterator_;
284 break; 383 break;
(...skipping 11 matching lines...) Expand all
296 operator++() { 395 operator++() {
297 switch (phase_) { 396 switch (phase_) {
298 case VISIBLE_RECT: 397 case VISIBLE_RECT:
299 ++visible_iterator_; 398 ++visible_iterator_;
300 if (visible_iterator_.done()) { 399 if (visible_iterator_.done()) {
301 AdvancePhase(); 400 AdvancePhase();
302 return *this; 401 return *this;
303 } 402 }
304 current_tile_ = *visible_iterator_; 403 current_tile_ = *visible_iterator_;
305 break; 404 break;
405 case PENDING_VISIBLE_RECT:
406 ++pending_visible_iterator_;
407 if (pending_visible_iterator_.done()) {
408 AdvancePhase();
409 return *this;
410 }
411 current_tile_ = *pending_visible_iterator_;
412 break;
306 case SKEWPORT_RECT: 413 case SKEWPORT_RECT:
307 ++skewport_iterator_; 414 ++skewport_iterator_;
308 if (skewport_iterator_.done()) { 415 if (skewport_iterator_.done()) {
309 AdvancePhase(); 416 AdvancePhase();
310 return *this; 417 return *this;
311 } 418 }
312 current_tile_ = *skewport_iterator_; 419 current_tile_ = *skewport_iterator_;
313 break; 420 break;
314 case SOON_BORDER_RECT: 421 case SOON_BORDER_RECT:
315 ++soon_border_iterator_; 422 ++soon_border_iterator_;
316 if (soon_border_iterator_.done()) { 423 if (soon_border_iterator_.done()) {
317 AdvancePhase(); 424 AdvancePhase();
318 return *this; 425 return *this;
319 } 426 }
320 current_tile_ = *soon_border_iterator_; 427 current_tile_ = *soon_border_iterator_;
321 break; 428 break;
322 case EVENTUALLY_RECT: 429 case EVENTUALLY_RECT:
323 ++eventually_iterator_; 430 ++eventually_iterator_;
324 if (eventually_iterator_.done()) { 431 if (eventually_iterator_.done()) {
325 current_tile_ = nullptr; 432 current_tile_ = nullptr;
326 return *this; 433 return *this;
327 } 434 }
328 current_tile_ = *eventually_iterator_; 435 current_tile_ = *eventually_iterator_;
329 break; 436 break;
330 } 437 }
331 return *this; 438 return *this;
332 } 439 }
333 440
334 } // namespace cc 441 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698