OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/picture_layer_tiling.h" | 5 #include "cc/picture_layer_tiling.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/math_util.h" | 8 #include "cc/math_util.h" |
9 #include "ui/gfx/point_conversions.h" | 9 #include "ui/gfx/point_conversions.h" |
10 #include "ui/gfx/rect_conversions.h" | 10 #include "ui/gfx/rect_conversions.h" |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 ++iter) { | 410 ++iter) { |
411 TileMap::iterator find = tiles_.find(iter.index()); | 411 TileMap::iterator find = tiles_.find(iter.index()); |
412 if (find == tiles_.end()) | 412 if (find == tiles_.end()) |
413 continue; | 413 continue; |
414 | 414 |
415 TilePriority priority; | 415 TilePriority priority; |
416 DCHECK(!priority.is_live); | 416 DCHECK(!priority.is_live); |
417 TileHandle* tile_handle = &find->second; | 417 TileHandle* tile_handle = &find->second; |
418 Tile* tile = tile_handle->tile(); | 418 Tile* tile = tile_handle->tile(); |
419 tile->set_priority(tree, priority); | 419 tile->set_priority(tree, priority); |
| 420 tile_handle->UnregisterFromTileManager(); |
420 } | 421 } |
421 last_prioritized_rect_ = inflated_rect; | 422 last_prioritized_rect_ = inflated_rect; |
422 | 423 |
423 gfx::Rect view_rect(device_viewport); | 424 gfx::Rect view_rect(device_viewport); |
424 float current_scale = current_layer_contents_scale / contents_scale_; | 425 float current_scale = current_layer_contents_scale / contents_scale_; |
425 float last_scale = last_layer_contents_scale / contents_scale_; | 426 float last_scale = last_layer_contents_scale / contents_scale_; |
426 | 427 |
427 // Fast path tile priority calculation when both transforms are translations. | 428 // Fast path tile priority calculation when both transforms are translations. |
428 if (last_screen_transform.IsIdentityOrTranslation() && | 429 if (last_screen_transform.IsIdentityOrTranslation() && |
429 current_screen_transform.IsIdentityOrTranslation()) | 430 current_screen_transform.IsIdentityOrTranslation()) |
430 { | 431 { |
431 gfx::Vector2dF current_offset( | 432 gfx::Vector2dF current_offset( |
432 current_screen_transform.matrix().get(0, 3), | 433 current_screen_transform.matrix().get(0, 3), |
433 current_screen_transform.matrix().get(1, 3)); | 434 current_screen_transform.matrix().get(1, 3)); |
434 gfx::Vector2dF last_offset( | 435 gfx::Vector2dF last_offset( |
435 last_screen_transform.matrix().get(0, 3), | 436 last_screen_transform.matrix().get(0, 3), |
436 last_screen_transform.matrix().get(1, 3)); | 437 last_screen_transform.matrix().get(1, 3)); |
437 | 438 |
438 for (TilingData::Iterator iter(&tiling_data_, inflated_rect); | 439 for (TilingData::Iterator iter(&tiling_data_, inflated_rect); |
439 iter; ++iter) { | 440 iter; ++iter) { |
440 TileMap::iterator find = tiles_.find(iter.index()); | 441 TileMap::iterator find = tiles_.find(iter.index()); |
441 if (find == tiles_.end()) | 442 if (find == tiles_.end()) |
442 continue; | 443 continue; |
443 TileHandle* tile_handle = &find->second; | 444 TileHandle* tile_handle = &find->second; |
444 Tile* tile = tile_handle->tile(); | 445 Tile* tile = tile_handle->tile(); |
| 446 tile_handle->RegisterWithTileManager(); |
445 | 447 |
446 gfx::Rect tile_bounds = | 448 gfx::Rect tile_bounds = |
447 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); | 449 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); |
448 gfx::RectF current_screen_rect = gfx::ScaleRect( | 450 gfx::RectF current_screen_rect = gfx::ScaleRect( |
449 tile_bounds, | 451 tile_bounds, |
450 current_scale, | 452 current_scale, |
451 current_scale) + current_offset; | 453 current_scale) + current_offset; |
452 gfx::RectF last_screen_rect = gfx::ScaleRect( | 454 gfx::RectF last_screen_rect = gfx::ScaleRect( |
453 tile_bounds, | 455 tile_bounds, |
454 last_scale, | 456 last_scale, |
(...skipping 14 matching lines...) Expand all Loading... |
469 tile->set_priority(tree, priority); | 471 tile->set_priority(tree, priority); |
470 } | 472 } |
471 } else { | 473 } else { |
472 for (TilingData::Iterator iter(&tiling_data_, inflated_rect); | 474 for (TilingData::Iterator iter(&tiling_data_, inflated_rect); |
473 iter; ++iter) { | 475 iter; ++iter) { |
474 TileMap::iterator find = tiles_.find(iter.index()); | 476 TileMap::iterator find = tiles_.find(iter.index()); |
475 if (find == tiles_.end()) | 477 if (find == tiles_.end()) |
476 continue; | 478 continue; |
477 TileHandle* tile_handle = &find->second; | 479 TileHandle* tile_handle = &find->second; |
478 Tile* tile = tile_handle->tile(); | 480 Tile* tile = tile_handle->tile(); |
| 481 tile_handle->RegisterWithTileManager(); |
479 | 482 |
480 gfx::Rect tile_bounds = | 483 gfx::Rect tile_bounds = |
481 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); | 484 tiling_data_.TileBounds(iter.index_x(), iter.index_y()); |
482 gfx::RectF current_layer_content_rect = gfx::ScaleRect( | 485 gfx::RectF current_layer_content_rect = gfx::ScaleRect( |
483 tile_bounds, | 486 tile_bounds, |
484 current_scale, | 487 current_scale, |
485 current_scale); | 488 current_scale); |
486 gfx::RectF current_screen_rect = MathUtil::mapClippedRect( | 489 gfx::RectF current_screen_rect = MathUtil::mapClippedRect( |
487 current_screen_transform, current_layer_content_rect); | 490 current_screen_transform, current_layer_content_rect); |
488 gfx::RectF last_layer_content_rect = gfx::ScaleRect( | 491 gfx::RectF last_layer_content_rect = gfx::ScaleRect( |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 | 539 |
537 scoped_ptr<base::Value> PictureLayerTiling::AsValue() const { | 540 scoped_ptr<base::Value> PictureLayerTiling::AsValue() const { |
538 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 541 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
539 state->SetInteger("num_tiles", tiles_.size()); | 542 state->SetInteger("num_tiles", tiles_.size()); |
540 state->SetDouble("content_scale", contents_scale_); | 543 state->SetDouble("content_scale", contents_scale_); |
541 state->Set("content_bounds", | 544 state->Set("content_bounds", |
542 MathUtil::asValue(ContentRect().size()).release()); | 545 MathUtil::asValue(ContentRect().size()).release()); |
543 return state.PassAs<base::Value>(); | 546 return state.PassAs<base::Value>(); |
544 } | 547 } |
545 | 548 |
546 TileHandle::TileHandle(scoped_refptr<Tile> tile) | 549 TileHandle::TileHandle(scoped_refptr<Tile> tile) : tile_(tile) { |
547 : tile_(tile), | 550 } |
548 managed_tile_state_(tile_->tile_manager()->RegisterTile(tile_)) { | 551 |
| 552 void TileHandle::RegisterWithTileManager() { |
| 553 if (managed_tile_state_.get()) |
| 554 return; |
| 555 managed_tile_state_ = tile_->tile_manager()->RegisterTile(tile_); |
| 556 } |
| 557 |
| 558 void TileHandle::UnregisterFromTileManager() { |
| 559 managed_tile_state_ = NULL; |
549 } | 560 } |
550 | 561 |
551 } // namespace cc | 562 } // namespace cc |
OLD | NEW |