| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/layers/tiled_layer.h" | 5 #include "cc/layers/tiled_layer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 if (!tile->valid_for_frame) { | 214 if (!tile->valid_for_frame) { |
| 215 // Invalidated tiles are set so they can get different debug colors. | 215 // Invalidated tiles are set so they can get different debug colors. |
| 216 tiled_layer->PushInvalidTile(i, j); | 216 tiled_layer->PushInvalidTile(i, j); |
| 217 continue; | 217 continue; |
| 218 } | 218 } |
| 219 | 219 |
| 220 tiled_layer->PushTileProperties( | 220 tiled_layer->PushTileProperties( |
| 221 i, | 221 i, |
| 222 j, | 222 j, |
| 223 tile->managed_resource()->resource_id(), | 223 tile->managed_resource()->resource_id(), |
| 224 tile->opaque_rect(), | |
| 225 tile->managed_resource()->contents_swizzled()); | 224 tile->managed_resource()->contents_swizzled()); |
| 226 } | 225 } |
| 227 for (std::vector<UpdatableTile*>::const_iterator iter = invalid_tiles.begin(); | 226 for (std::vector<UpdatableTile*>::const_iterator iter = invalid_tiles.begin(); |
| 228 iter != invalid_tiles.end(); | 227 iter != invalid_tiles.end(); |
| 229 ++iter) | 228 ++iter) |
| 230 tiler_->TakeTile((*iter)->i(), (*iter)->j()); | 229 tiler_->TakeTile((*iter)->i(), (*iter)->j()); |
| 231 | 230 |
| 232 // TiledLayer must push properties every frame, since viewport state and | 231 // TiledLayer must push properties every frame, since viewport state and |
| 233 // occlusion from anywhere in the tree can change what the layer decides to | 232 // occlusion from anywhere in the tree can change what the layer decides to |
| 234 // push to the impl tree. | 233 // push to the impl tree. |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 paint_properties().bounds.height() / | 469 paint_properties().bounds.height() / |
| 471 static_cast<float>(content_bounds().height()); | 470 static_cast<float>(content_bounds().height()); |
| 472 update_rect_ = gfx::ScaleRect(update_rect, width_scale, height_scale); | 471 update_rect_ = gfx::ScaleRect(update_rect, width_scale, height_scale); |
| 473 | 472 |
| 474 // Calling PrepareToUpdate() calls into WebKit to paint, which may have the | 473 // Calling PrepareToUpdate() calls into WebKit to paint, which may have the |
| 475 // side effect of disabling compositing, which causes our reference to the | 474 // side effect of disabling compositing, which causes our reference to the |
| 476 // texture updater to be deleted. However, we can't free the memory backing | 475 // texture updater to be deleted. However, we can't free the memory backing |
| 477 // the SkCanvas until the paint finishes, so we grab a local reference here to | 476 // the SkCanvas until the paint finishes, so we grab a local reference here to |
| 478 // hold the updater alive until the paint completes. | 477 // hold the updater alive until the paint completes. |
| 479 scoped_refptr<LayerUpdater> protector(Updater()); | 478 scoped_refptr<LayerUpdater> protector(Updater()); |
| 480 gfx::Rect painted_opaque_rect; | 479 Updater()->PrepareToUpdate( |
| 481 Updater()->PrepareToUpdate(paint_rect, | 480 paint_rect, tiler_->tile_size(), 1.f / width_scale, 1.f / height_scale); |
| 482 tiler_->tile_size(), | |
| 483 1.f / width_scale, | |
| 484 1.f / height_scale, | |
| 485 &painted_opaque_rect); | |
| 486 | 481 |
| 487 for (int j = top; j <= bottom; ++j) { | 482 for (int j = top; j <= bottom; ++j) { |
| 488 for (int i = left; i <= right; ++i) { | 483 for (int i = left; i <= right; ++i) { |
| 489 UpdatableTile* tile = TileAt(i, j); | 484 UpdatableTile* tile = TileAt(i, j); |
| 490 DCHECK(tile); // Did SetTexturePriorites get skipped? | 485 DCHECK(tile); // Did SetTexturePriorites get skipped? |
| 491 // TODO(enne): This should not ever be null. | 486 // TODO(enne): This should not ever be null. |
| 492 if (!tile) | 487 if (!tile) |
| 493 continue; | 488 continue; |
| 494 | 489 |
| 495 gfx::Rect tile_rect = tiler_->tile_bounds(i, j); | 490 gfx::Rect tile_rect = tiler_->tile_bounds(i, j); |
| 496 | 491 |
| 497 // Use update_rect as the above loop copied the dirty rect for this frame | 492 // Use update_rect as the above loop copied the dirty rect for this frame |
| 498 // to update_rect. | 493 // to update_rect. |
| 499 gfx::Rect dirty_rect = tile->update_rect; | 494 gfx::Rect dirty_rect = tile->update_rect; |
| 500 if (dirty_rect.IsEmpty()) | 495 if (dirty_rect.IsEmpty()) |
| 501 continue; | 496 continue; |
| 502 | 497 |
| 503 // Save what was painted opaque in the tile. Keep the old area if the | |
| 504 // paint didn't touch it, and didn't paint some other part of the tile | |
| 505 // opaque. | |
| 506 gfx::Rect tile_painted_rect = gfx::IntersectRects(tile_rect, paint_rect); | |
| 507 gfx::Rect tile_painted_opaque_rect = | |
| 508 gfx::IntersectRects(tile_rect, painted_opaque_rect); | |
| 509 if (!tile_painted_rect.IsEmpty()) { | |
| 510 gfx::Rect paint_inside_tile_opaque_rect = | |
| 511 gfx::IntersectRects(tile->opaque_rect(), tile_painted_rect); | |
| 512 bool paint_inside_tile_opaque_rect_is_non_opaque = | |
| 513 !paint_inside_tile_opaque_rect.IsEmpty() && | |
| 514 !tile_painted_opaque_rect.Contains(paint_inside_tile_opaque_rect); | |
| 515 bool opaque_paint_not_inside_tile_opaque_rect = | |
| 516 !tile_painted_opaque_rect.IsEmpty() && | |
| 517 !tile->opaque_rect().Contains(tile_painted_opaque_rect); | |
| 518 | |
| 519 if (paint_inside_tile_opaque_rect_is_non_opaque || | |
| 520 opaque_paint_not_inside_tile_opaque_rect) | |
| 521 tile->set_opaque_rect(tile_painted_opaque_rect); | |
| 522 } | |
| 523 | |
| 524 // source_rect starts as a full-sized tile with border texels included. | 498 // source_rect starts as a full-sized tile with border texels included. |
| 525 gfx::Rect source_rect = tiler_->TileRect(tile); | 499 gfx::Rect source_rect = tiler_->TileRect(tile); |
| 526 source_rect.Intersect(dirty_rect); | 500 source_rect.Intersect(dirty_rect); |
| 527 // Paint rect not guaranteed to line up on tile boundaries, so | 501 // Paint rect not guaranteed to line up on tile boundaries, so |
| 528 // make sure that source_rect doesn't extend outside of it. | 502 // make sure that source_rect doesn't extend outside of it. |
| 529 source_rect.Intersect(paint_rect); | 503 source_rect.Intersect(paint_rect); |
| 530 | 504 |
| 531 tile->update_rect = source_rect; | 505 tile->update_rect = source_rect; |
| 532 | 506 |
| 533 if (source_rect.IsEmpty()) | 507 if (source_rect.IsEmpty()) |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 tile_rect, | 610 tile_rect, |
| 637 draws_to_root, | 611 draws_to_root, |
| 638 small_animated_layer, | 612 small_animated_layer, |
| 639 tile->managed_resource()); | 613 tile->managed_resource()); |
| 640 } | 614 } |
| 641 } | 615 } |
| 642 | 616 |
| 643 SimpleEnclosedRegion TiledLayer::VisibleContentOpaqueRegion() const { | 617 SimpleEnclosedRegion TiledLayer::VisibleContentOpaqueRegion() const { |
| 644 if (skips_draw_) | 618 if (skips_draw_) |
| 645 return SimpleEnclosedRegion(); | 619 return SimpleEnclosedRegion(); |
| 646 if (contents_opaque()) | 620 return Layer::VisibleContentOpaqueRegion(); |
| 647 return SimpleEnclosedRegion(visible_content_rect()); | |
| 648 return tiler_->OpaqueRegionInContentRect(visible_content_rect()); | |
| 649 } | 621 } |
| 650 | 622 |
| 651 void TiledLayer::ResetUpdateState() { | 623 void TiledLayer::ResetUpdateState() { |
| 652 skips_draw_ = false; | 624 skips_draw_ = false; |
| 653 failed_update_ = false; | 625 failed_update_ = false; |
| 654 | 626 |
| 655 LayerTilingData::TileMap::const_iterator end = tiler_->tiles().end(); | 627 LayerTilingData::TileMap::const_iterator end = tiler_->tiles().end(); |
| 656 for (LayerTilingData::TileMap::const_iterator iter = tiler_->tiles().begin(); | 628 for (LayerTilingData::TileMap::const_iterator iter = tiler_->tiles().begin(); |
| 657 iter != end; | 629 iter != end; |
| 658 ++iter) { | 630 ++iter) { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 gfx::Rect prepaint_rect = visible_content_rect(); | 864 gfx::Rect prepaint_rect = visible_content_rect(); |
| 893 prepaint_rect.Inset(-tiler_->tile_size().width() * kPrepaintColumns, | 865 prepaint_rect.Inset(-tiler_->tile_size().width() * kPrepaintColumns, |
| 894 -tiler_->tile_size().height() * kPrepaintRows); | 866 -tiler_->tile_size().height() * kPrepaintRows); |
| 895 gfx::Rect content_rect(content_bounds()); | 867 gfx::Rect content_rect(content_bounds()); |
| 896 prepaint_rect.Intersect(content_rect); | 868 prepaint_rect.Intersect(content_rect); |
| 897 | 869 |
| 898 return prepaint_rect; | 870 return prepaint_rect; |
| 899 } | 871 } |
| 900 | 872 |
| 901 } // namespace cc | 873 } // namespace cc |
| OLD | NEW |