| 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/layer_impl.h" | 5 #include "cc/layer_impl.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "cc/debug_border_draw_quad.h" | 10 #include "cc/debug_border_draw_quad.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 #ifndef NDEBUG | 62 #ifndef NDEBUG |
| 63 DCHECK(!m_betweenWillDrawAndDidDraw); | 63 DCHECK(!m_betweenWillDrawAndDidDraw); |
| 64 #endif | 64 #endif |
| 65 } | 65 } |
| 66 | 66 |
| 67 void LayerImpl::addChild(scoped_ptr<LayerImpl> child) | 67 void LayerImpl::addChild(scoped_ptr<LayerImpl> child) |
| 68 { | 68 { |
| 69 child->setParent(this); | 69 child->setParent(this); |
| 70 DCHECK_EQ(layerTreeHostImpl(), child->layerTreeHostImpl()); | 70 DCHECK_EQ(layerTreeHostImpl(), child->layerTreeHostImpl()); |
| 71 m_children.append(child.Pass()); | 71 m_children.append(child.Pass()); |
| 72 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 72 } | 73 } |
| 73 | 74 |
| 74 void LayerImpl::removeFromParent() | 75 void LayerImpl::removeFromParent() |
| 75 { | 76 { |
| 76 if (!m_parent) | 77 if (!m_parent) |
| 77 return; | 78 return; |
| 78 | 79 |
| 79 LayerImpl* parent = m_parent; | 80 LayerImpl* parent = m_parent; |
| 80 m_parent = 0; | 81 m_parent = 0; |
| 81 | 82 |
| 82 for (size_t i = 0; i < parent->m_children.size(); ++i) { | 83 for (size_t i = 0; i < parent->m_children.size(); ++i) { |
| 83 if (parent->m_children[i] == this) { | 84 if (parent->m_children[i] == this) { |
| 85 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 86 // This remove call deletes |this|, so don't touch it anymore. |
| 84 parent->m_children.remove(i); | 87 parent->m_children.remove(i); |
| 85 return; | 88 return; |
| 86 } | 89 } |
| 87 } | 90 } |
| 88 } | 91 } |
| 89 | 92 |
| 90 void LayerImpl::removeAllChildren() | 93 void LayerImpl::removeAllChildren() |
| 91 { | 94 { |
| 92 while (m_children.size()) | 95 while (m_children.size()) |
| 93 m_children[0]->removeFromParent(); | 96 m_children[0]->removeFromParent(); |
| 94 } | 97 } |
| 95 | 98 |
| 96 void LayerImpl::clearChildList() | 99 void LayerImpl::clearChildList() |
| 97 { | 100 { |
| 101 if (m_children.isEmpty()) |
| 102 return; |
| 103 |
| 98 m_children.clear(); | 104 m_children.clear(); |
| 105 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 99 } | 106 } |
| 100 | 107 |
| 101 void LayerImpl::createRenderSurface() | 108 void LayerImpl::createRenderSurface() |
| 102 { | 109 { |
| 103 DCHECK(!m_drawProperties.render_surface); | 110 DCHECK(!m_drawProperties.render_surface); |
| 104 m_drawProperties.render_surface = make_scoped_ptr(new RenderSurfaceImpl(this
)); | 111 m_drawProperties.render_surface = make_scoped_ptr(new RenderSurfaceImpl(this
)); |
| 105 m_drawProperties.render_target = this; | 112 m_drawProperties.render_target = this; |
| 106 } | 113 } |
| 107 | 114 |
| 108 int LayerImpl::descendantsDrawContent() | 115 int LayerImpl::descendantsDrawContent() |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 LayerImpl* current = this->m_parent; | 404 LayerImpl* current = this->m_parent; |
| 398 while (current && !current->m_drawProperties.render_surface) { | 405 while (current && !current->m_drawProperties.render_surface) { |
| 399 if (current->m_layerSurfacePropertyChanged) | 406 if (current->m_layerSurfacePropertyChanged) |
| 400 return true; | 407 return true; |
| 401 current = current->m_parent; | 408 current = current->m_parent; |
| 402 } | 409 } |
| 403 | 410 |
| 404 return false; | 411 return false; |
| 405 } | 412 } |
| 406 | 413 |
| 414 void LayerImpl::noteLayerSurfacePropertyChanged() |
| 415 { |
| 416 m_layerSurfacePropertyChanged = true; |
| 417 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 418 } |
| 419 |
| 420 void LayerImpl::noteLayerPropertyChanged() |
| 421 { |
| 422 m_layerPropertyChanged = true; |
| 423 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 424 } |
| 425 |
| 407 void LayerImpl::noteLayerPropertyChangedForSubtree() | 426 void LayerImpl::noteLayerPropertyChangedForSubtree() |
| 408 { | 427 { |
| 409 m_layerPropertyChanged = true; | 428 noteLayerPropertyChanged(); |
| 410 noteLayerPropertyChangedForDescendants(); | 429 noteLayerPropertyChangedForDescendants(); |
| 411 } | 430 } |
| 412 | 431 |
| 413 void LayerImpl::noteLayerPropertyChangedForDescendants() | 432 void LayerImpl::noteLayerPropertyChangedForDescendants() |
| 414 { | 433 { |
| 434 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 415 for (size_t i = 0; i < m_children.size(); ++i) | 435 for (size_t i = 0; i < m_children.size(); ++i) |
| 416 m_children[i]->noteLayerPropertyChangedForSubtree(); | 436 m_children[i]->noteLayerPropertyChangedForSubtree(); |
| 417 } | 437 } |
| 418 | 438 |
| 419 const char* LayerImpl::layerTypeAsString() const | 439 const char* LayerImpl::layerTypeAsString() const |
| 420 { | 440 { |
| 421 return "Layer"; | 441 return "Layer"; |
| 422 } | 442 } |
| 423 | 443 |
| 424 void LayerImpl::resetAllChangeTrackingForSubtree() | 444 void LayerImpl::resetAllChangeTrackingForSubtree() |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 void LayerImpl::setBounds(const gfx::Size& bounds) | 494 void LayerImpl::setBounds(const gfx::Size& bounds) |
| 475 { | 495 { |
| 476 if (m_bounds == bounds) | 496 if (m_bounds == bounds) |
| 477 return; | 497 return; |
| 478 | 498 |
| 479 m_bounds = bounds; | 499 m_bounds = bounds; |
| 480 | 500 |
| 481 if (masksToBounds()) | 501 if (masksToBounds()) |
| 482 noteLayerPropertyChangedForSubtree(); | 502 noteLayerPropertyChangedForSubtree(); |
| 483 else | 503 else |
| 484 m_layerPropertyChanged = true; | 504 noteLayerPropertyChanged(); |
| 485 } | 505 } |
| 486 | 506 |
| 487 void LayerImpl::setMaskLayer(scoped_ptr<LayerImpl> maskLayer) | 507 void LayerImpl::setMaskLayer(scoped_ptr<LayerImpl> maskLayer) |
| 488 { | 508 { |
| 489 if (maskLayer) | 509 if (maskLayer) |
| 490 DCHECK_EQ(layerTreeHostImpl(), maskLayer->layerTreeHostImpl()); | 510 DCHECK_EQ(layerTreeHostImpl(), maskLayer->layerTreeHostImpl()); |
| 491 m_maskLayer = maskLayer.Pass(); | 511 m_maskLayer = maskLayer.Pass(); |
| 492 | 512 |
| 493 int newLayerId = m_maskLayer ? m_maskLayer->id() : -1; | 513 int newLayerId = m_maskLayer ? m_maskLayer->id() : -1; |
| 494 if (newLayerId == m_maskLayerId) | 514 if (newLayerId == m_maskLayerId) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 511 m_replicaLayerId = newLayerId; | 531 m_replicaLayerId = newLayerId; |
| 512 noteLayerPropertyChangedForSubtree(); | 532 noteLayerPropertyChangedForSubtree(); |
| 513 } | 533 } |
| 514 | 534 |
| 515 void LayerImpl::setDrawsContent(bool drawsContent) | 535 void LayerImpl::setDrawsContent(bool drawsContent) |
| 516 { | 536 { |
| 517 if (m_drawsContent == drawsContent) | 537 if (m_drawsContent == drawsContent) |
| 518 return; | 538 return; |
| 519 | 539 |
| 520 m_drawsContent = drawsContent; | 540 m_drawsContent = drawsContent; |
| 521 m_layerPropertyChanged = true; | 541 noteLayerPropertyChanged(); |
| 522 } | 542 } |
| 523 | 543 |
| 524 void LayerImpl::setAnchorPoint(const gfx::PointF& anchorPoint) | 544 void LayerImpl::setAnchorPoint(const gfx::PointF& anchorPoint) |
| 525 { | 545 { |
| 526 if (m_anchorPoint == anchorPoint) | 546 if (m_anchorPoint == anchorPoint) |
| 527 return; | 547 return; |
| 528 | 548 |
| 529 m_anchorPoint = anchorPoint; | 549 m_anchorPoint = anchorPoint; |
| 530 noteLayerPropertyChangedForSubtree(); | 550 noteLayerPropertyChangedForSubtree(); |
| 531 } | 551 } |
| 532 | 552 |
| 533 void LayerImpl::setAnchorPointZ(float anchorPointZ) | 553 void LayerImpl::setAnchorPointZ(float anchorPointZ) |
| 534 { | 554 { |
| 535 if (m_anchorPointZ == anchorPointZ) | 555 if (m_anchorPointZ == anchorPointZ) |
| 536 return; | 556 return; |
| 537 | 557 |
| 538 m_anchorPointZ = anchorPointZ; | 558 m_anchorPointZ = anchorPointZ; |
| 539 noteLayerPropertyChangedForSubtree(); | 559 noteLayerPropertyChangedForSubtree(); |
| 540 } | 560 } |
| 541 | 561 |
| 542 void LayerImpl::setBackgroundColor(SkColor backgroundColor) | 562 void LayerImpl::setBackgroundColor(SkColor backgroundColor) |
| 543 { | 563 { |
| 544 if (m_backgroundColor == backgroundColor) | 564 if (m_backgroundColor == backgroundColor) |
| 545 return; | 565 return; |
| 546 | 566 |
| 547 m_backgroundColor = backgroundColor; | 567 m_backgroundColor = backgroundColor; |
| 548 m_layerPropertyChanged = true; | 568 noteLayerPropertyChanged(); |
| 549 } | 569 } |
| 550 | 570 |
| 551 void LayerImpl::setFilters(const WebKit::WebFilterOperations& filters) | 571 void LayerImpl::setFilters(const WebKit::WebFilterOperations& filters) |
| 552 { | 572 { |
| 553 if (m_filters == filters) | 573 if (m_filters == filters) |
| 554 return; | 574 return; |
| 555 | 575 |
| 556 DCHECK(!m_filter); | 576 DCHECK(!m_filter); |
| 557 m_filters = filters; | 577 m_filters = filters; |
| 558 noteLayerPropertyChangedForSubtree(); | 578 noteLayerPropertyChangedForSubtree(); |
| 559 } | 579 } |
| 560 | 580 |
| 561 void LayerImpl::setBackgroundFilters(const WebKit::WebFilterOperations& backgrou
ndFilters) | 581 void LayerImpl::setBackgroundFilters(const WebKit::WebFilterOperations& backgrou
ndFilters) |
| 562 { | 582 { |
| 563 if (m_backgroundFilters == backgroundFilters) | 583 if (m_backgroundFilters == backgroundFilters) |
| 564 return; | 584 return; |
| 565 | 585 |
| 566 m_backgroundFilters = backgroundFilters; | 586 m_backgroundFilters = backgroundFilters; |
| 567 m_layerPropertyChanged = true; | 587 noteLayerPropertyChanged(); |
| 568 } | 588 } |
| 569 | 589 |
| 570 void LayerImpl::setFilter(const skia::RefPtr<SkImageFilter>& filter) | 590 void LayerImpl::setFilter(const skia::RefPtr<SkImageFilter>& filter) |
| 571 { | 591 { |
| 572 if (m_filter.get() == filter.get()) | 592 if (m_filter.get() == filter.get()) |
| 573 return; | 593 return; |
| 574 | 594 |
| 575 DCHECK(m_filters.isEmpty()); | 595 DCHECK(m_filters.isEmpty()); |
| 576 m_filter = filter; | 596 m_filter = filter; |
| 577 noteLayerPropertyChangedForSubtree(); | 597 noteLayerPropertyChangedForSubtree(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 594 m_contentsOpaque = opaque; | 614 m_contentsOpaque = opaque; |
| 595 noteLayerPropertyChangedForSubtree(); | 615 noteLayerPropertyChangedForSubtree(); |
| 596 } | 616 } |
| 597 | 617 |
| 598 void LayerImpl::setOpacity(float opacity) | 618 void LayerImpl::setOpacity(float opacity) |
| 599 { | 619 { |
| 600 if (m_opacity == opacity) | 620 if (m_opacity == opacity) |
| 601 return; | 621 return; |
| 602 | 622 |
| 603 m_opacity = opacity; | 623 m_opacity = opacity; |
| 604 m_layerSurfacePropertyChanged = true; | 624 noteLayerSurfacePropertyChanged(); |
| 605 } | 625 } |
| 606 | 626 |
| 607 bool LayerImpl::opacityIsAnimating() const | 627 bool LayerImpl::opacityIsAnimating() const |
| 608 { | 628 { |
| 609 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Opac
ity); | 629 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Opac
ity); |
| 610 } | 630 } |
| 611 | 631 |
| 612 void LayerImpl::setPosition(const gfx::PointF& position) | 632 void LayerImpl::setPosition(const gfx::PointF& position) |
| 613 { | 633 { |
| 614 if (m_position == position) | 634 if (m_position == position) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 636 // sublayer transform does not affect the current layer; it affects only its
children. | 656 // sublayer transform does not affect the current layer; it affects only its
children. |
| 637 noteLayerPropertyChangedForDescendants(); | 657 noteLayerPropertyChangedForDescendants(); |
| 638 } | 658 } |
| 639 | 659 |
| 640 void LayerImpl::setTransform(const gfx::Transform& transform) | 660 void LayerImpl::setTransform(const gfx::Transform& transform) |
| 641 { | 661 { |
| 642 if (m_transform == transform) | 662 if (m_transform == transform) |
| 643 return; | 663 return; |
| 644 | 664 |
| 645 m_transform = transform; | 665 m_transform = transform; |
| 646 m_layerSurfacePropertyChanged = true; | 666 noteLayerSurfacePropertyChanged(); |
| 647 } | 667 } |
| 648 | 668 |
| 649 bool LayerImpl::transformIsAnimating() const | 669 bool LayerImpl::transformIsAnimating() const |
| 650 { | 670 { |
| 651 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Tran
sform); | 671 return m_layerAnimationController->isAnimatingProperty(ActiveAnimation::Tran
sform); |
| 652 } | 672 } |
| 653 | 673 |
| 654 void LayerImpl::setContentBounds(const gfx::Size& contentBounds) | 674 void LayerImpl::setContentBounds(const gfx::Size& contentBounds) |
| 655 { | 675 { |
| 656 if (m_contentBounds == contentBounds) | 676 if (m_contentBounds == contentBounds) |
| 657 return; | 677 return; |
| 658 | 678 |
| 659 m_contentBounds = contentBounds; | 679 m_contentBounds = contentBounds; |
| 660 m_layerPropertyChanged = true; | 680 noteLayerPropertyChanged(); |
| 661 } | 681 } |
| 662 | 682 |
| 663 void LayerImpl::setContentsScale(float contentsScaleX, float contentsScaleY) | 683 void LayerImpl::setContentsScale(float contentsScaleX, float contentsScaleY) |
| 664 { | 684 { |
| 665 if (m_contentsScaleX == contentsScaleX && m_contentsScaleY == contentsScaleY
) | 685 if (m_contentsScaleX == contentsScaleX && m_contentsScaleY == contentsScaleY
) |
| 666 return; | 686 return; |
| 667 | 687 |
| 668 m_contentsScaleX = contentsScaleX; | 688 m_contentsScaleX = contentsScaleX; |
| 669 m_contentsScaleY = contentsScaleY; | 689 m_contentsScaleY = contentsScaleY; |
| 670 m_layerPropertyChanged = true; | 690 noteLayerPropertyChanged(); |
| 671 } | 691 } |
| 672 | 692 |
| 673 void LayerImpl::setScrollOffset(gfx::Vector2d scrollOffset) | 693 void LayerImpl::setScrollOffset(gfx::Vector2d scrollOffset) |
| 674 { | 694 { |
| 675 if (m_scrollOffset == scrollOffset) | 695 if (m_scrollOffset == scrollOffset) |
| 676 return; | 696 return; |
| 677 | 697 |
| 678 m_scrollOffset = scrollOffset; | 698 m_scrollOffset = scrollOffset; |
| 679 noteLayerPropertyChangedForSubtree(); | 699 noteLayerPropertyChangedForSubtree(); |
| 680 } | 700 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 return visibleContentRect(); | 732 return visibleContentRect(); |
| 713 return Region(); | 733 return Region(); |
| 714 } | 734 } |
| 715 | 735 |
| 716 void LayerImpl::didLoseOutputSurface() | 736 void LayerImpl::didLoseOutputSurface() |
| 717 { | 737 { |
| 718 } | 738 } |
| 719 | 739 |
| 720 void LayerImpl::setMaxScrollOffset(gfx::Vector2d maxScrollOffset) | 740 void LayerImpl::setMaxScrollOffset(gfx::Vector2d maxScrollOffset) |
| 721 { | 741 { |
| 742 if (m_maxScrollOffset == maxScrollOffset) |
| 743 return; |
| 722 m_maxScrollOffset = maxScrollOffset; | 744 m_maxScrollOffset = maxScrollOffset; |
| 723 | 745 |
| 746 m_layerTreeHostImpl->setNeedsUpdateDrawProperties(); |
| 747 |
| 724 if (!m_scrollbarAnimationController) | 748 if (!m_scrollbarAnimationController) |
| 725 return; | 749 return; |
| 726 m_scrollbarAnimationController->updateScrollOffset(this); | 750 m_scrollbarAnimationController->updateScrollOffset(this); |
| 727 } | 751 } |
| 728 | 752 |
| 729 ScrollbarLayerImpl* LayerImpl::horizontalScrollbarLayer() | 753 ScrollbarLayerImpl* LayerImpl::horizontalScrollbarLayer() |
| 730 { | 754 { |
| 731 return m_scrollbarAnimationController ? m_scrollbarAnimationController->hori
zontalScrollbarLayer() : 0; | 755 return m_scrollbarAnimationController ? m_scrollbarAnimationController->hori
zontalScrollbarLayer() : 0; |
| 732 } | 756 } |
| 733 | 757 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 756 | 780 |
| 757 void LayerImpl::setVerticalScrollbarLayer(ScrollbarLayerImpl* scrollbarLayer) | 781 void LayerImpl::setVerticalScrollbarLayer(ScrollbarLayerImpl* scrollbarLayer) |
| 758 { | 782 { |
| 759 if (!m_scrollbarAnimationController) | 783 if (!m_scrollbarAnimationController) |
| 760 m_scrollbarAnimationController = ScrollbarAnimationController::create(th
is); | 784 m_scrollbarAnimationController = ScrollbarAnimationController::create(th
is); |
| 761 m_scrollbarAnimationController->setVerticalScrollbarLayer(scrollbarLayer); | 785 m_scrollbarAnimationController->setVerticalScrollbarLayer(scrollbarLayer); |
| 762 m_scrollbarAnimationController->updateScrollOffset(this); | 786 m_scrollbarAnimationController->updateScrollOffset(this); |
| 763 } | 787 } |
| 764 | 788 |
| 765 } // namespace cc | 789 } // namespace cc |
| OLD | NEW |