OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 } | 703 } |
704 } | 704 } |
705 | 705 |
706 void RenderLayer::setHasVisibleContent() | 706 void RenderLayer::setHasVisibleContent() |
707 { | 707 { |
708 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { | 708 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { |
709 ASSERT(!parent() || parent()->hasVisibleDescendant()); | 709 ASSERT(!parent() || parent()->hasVisibleDescendant()); |
710 return; | 710 return; |
711 } | 711 } |
712 | 712 |
| 713 m_hasVisibleContent = true; |
713 m_visibleContentStatusDirty = false; | 714 m_visibleContentStatusDirty = false; |
714 m_hasVisibleContent = true; | 715 |
| 716 { |
| 717 // FIXME: We can remove this code once we remove the recursive tree |
| 718 // walk inside updateGraphicsLayerGeometry. |
| 719 DisableCompositingQueryAsserts disabler; |
| 720 if (RenderLayer* compositingLayer = enclosingCompositingLayer()) |
| 721 compositingLayer->compositedLayerMapping()->setNeedsGeometryUpdate()
; |
| 722 } |
| 723 |
715 repainter().computeRepaintRects(renderer()->containerForRepaint()); | 724 repainter().computeRepaintRects(renderer()->containerForRepaint()); |
716 if (!m_stackingNode->isNormalFlowOnly()) { | 725 if (!m_stackingNode->isNormalFlowOnly()) { |
717 // We don't collect invisible layers in z-order lists if we are not in c
ompositing mode. | 726 // We don't collect invisible layers in z-order lists if we are not in c
ompositing mode. |
718 // As we became visible, we need to dirty our stacking containers ancest
ors to be properly | 727 // As we became visible, we need to dirty our stacking containers ancest
ors to be properly |
719 // collected. FIXME: When compositing, we could skip this dirtying phase
. | 728 // collected. FIXME: When compositing, we could skip this dirtying phase
. |
720 for (RenderLayerStackingNode* sc = m_stackingNode->ancestorStackingConta
inerNode(); sc; sc = sc->ancestorStackingContainerNode()) { | 729 for (RenderLayerStackingNode* sc = m_stackingNode->ancestorStackingConta
inerNode(); sc; sc = sc->ancestorStackingContainerNode()) { |
721 sc->dirtyZOrderLists(); | 730 sc->dirtyZOrderLists(); |
722 if (sc->layer()->hasVisibleContent()) | 731 if (sc->layer()->hasVisibleContent()) |
723 break; | 732 break; |
724 } | 733 } |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 | 850 |
842 m_blendInfo.setChildLayerHasBlendMode(childLayerHasBlendMode); | 851 m_blendInfo.setChildLayerHasBlendMode(childLayerHasBlendMode); |
843 | 852 |
844 if (childLayerHasBlendMode) | 853 if (childLayerHasBlendMode) |
845 break; | 854 break; |
846 } | 855 } |
847 m_blendInfo.setChildLayerHasBlendModeStatusDirty(false); | 856 m_blendInfo.setChildLayerHasBlendModeStatusDirty(false); |
848 } | 857 } |
849 | 858 |
850 if (m_visibleContentStatusDirty) { | 859 if (m_visibleContentStatusDirty) { |
| 860 bool previouslyHasVisibleCOntent = m_hasVisibleContent; |
851 if (renderer()->style()->visibility() == VISIBLE) | 861 if (renderer()->style()->visibility() == VISIBLE) |
852 m_hasVisibleContent = true; | 862 m_hasVisibleContent = true; |
853 else { | 863 else { |
854 // layer may be hidden but still have some visible content, check fo
r this | 864 // layer may be hidden but still have some visible content, check fo
r this |
855 m_hasVisibleContent = false; | 865 m_hasVisibleContent = false; |
856 RenderObject* r = renderer()->firstChild(); | 866 RenderObject* r = renderer()->firstChild(); |
857 while (r) { | 867 while (r) { |
858 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { | 868 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { |
859 m_hasVisibleContent = true; | 869 m_hasVisibleContent = true; |
860 break; | 870 break; |
861 } | 871 } |
862 if (r->firstChild() && !r->hasLayer()) | 872 if (r->firstChild() && !r->hasLayer()) |
863 r = r->firstChild(); | 873 r = r->firstChild(); |
864 else if (r->nextSibling()) | 874 else if (r->nextSibling()) |
865 r = r->nextSibling(); | 875 r = r->nextSibling(); |
866 else { | 876 else { |
867 do { | 877 do { |
868 r = r->parent(); | 878 r = r->parent(); |
869 if (r == renderer()) | 879 if (r == renderer()) |
870 r = 0; | 880 r = 0; |
871 } while (r && !r->nextSibling()); | 881 } while (r && !r->nextSibling()); |
872 if (r) | 882 if (r) |
873 r = r->nextSibling(); | 883 r = r->nextSibling(); |
874 } | 884 } |
875 } | 885 } |
876 } | 886 } |
877 m_visibleContentStatusDirty = false; | 887 m_visibleContentStatusDirty = false; |
| 888 |
| 889 // FIXME: We can remove this code once we remove the recursive tree |
| 890 // walk inside updateGraphicsLayerGeometry. |
| 891 if (hasVisibleContent() != previouslyHasVisibleCOntent) { |
| 892 DisableCompositingQueryAsserts disabler; |
| 893 if (RenderLayer* compositingLayer = enclosingCompositingLayer()) |
| 894 compositingLayer->compositedLayerMapping()->setNeedsGeometryUpda
te(); |
| 895 } |
878 } | 896 } |
879 } | 897 } |
880 | 898 |
881 void RenderLayer::dirty3DTransformedDescendantStatus() | 899 void RenderLayer::dirty3DTransformedDescendantStatus() |
882 { | 900 { |
883 RenderLayerStackingNode* stackingNode = m_stackingNode->ancestorStackingCont
ainerNode(); | 901 RenderLayerStackingNode* stackingNode = m_stackingNode->ancestorStackingCont
ainerNode(); |
884 if (!stackingNode) | 902 if (!stackingNode) |
885 return; | 903 return; |
886 | 904 |
887 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true; | 905 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true; |
(...skipping 2616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3504 CompositedLayerMappingPtr RenderLayer::compositedLayerMapping() const | 3522 CompositedLayerMappingPtr RenderLayer::compositedLayerMapping() const |
3505 { | 3523 { |
3506 ASSERT(isAllowedToQueryCompositingState()); | 3524 ASSERT(isAllowedToQueryCompositingState()); |
3507 return m_compositedLayerMapping.get(); | 3525 return m_compositedLayerMapping.get(); |
3508 } | 3526 } |
3509 | 3527 |
3510 CompositedLayerMappingPtr RenderLayer::ensureCompositedLayerMapping() | 3528 CompositedLayerMappingPtr RenderLayer::ensureCompositedLayerMapping() |
3511 { | 3529 { |
3512 if (!m_compositedLayerMapping) { | 3530 if (!m_compositedLayerMapping) { |
3513 m_compositedLayerMapping = adoptPtr(new CompositedLayerMapping(this)); | 3531 m_compositedLayerMapping = adoptPtr(new CompositedLayerMapping(this)); |
| 3532 m_compositedLayerMapping->setNeedsGeometryUpdate(); |
3514 | 3533 |
3515 updateOrRemoveFilterEffectRenderer(); | 3534 updateOrRemoveFilterEffectRenderer(); |
3516 | 3535 |
3517 if (RuntimeEnabledFeatures::cssCompositingEnabled()) | 3536 if (RuntimeEnabledFeatures::cssCompositingEnabled()) |
3518 compositedLayerMapping()->setBlendMode(m_blendInfo.blendMode()); | 3537 compositedLayerMapping()->setBlendMode(m_blendInfo.blendMode()); |
3519 } | 3538 } |
3520 return m_compositedLayerMapping.get(); | 3539 return m_compositedLayerMapping.get(); |
3521 } | 3540 } |
3522 | 3541 |
3523 void RenderLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) | 3542 void RenderLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) |
3524 { | 3543 { |
| 3544 if (!layerBeingDestroyed) |
| 3545 m_compositedLayerMapping->setNeedsGeometryUpdate(); |
| 3546 |
3525 m_compositedLayerMapping.clear(); | 3547 m_compositedLayerMapping.clear(); |
3526 | 3548 |
3527 if (!layerBeingDestroyed) | 3549 if (!layerBeingDestroyed) |
3528 updateOrRemoveFilterEffectRenderer(); | 3550 updateOrRemoveFilterEffectRenderer(); |
3529 } | 3551 } |
3530 | 3552 |
3531 bool RenderLayer::hasCompositedMask() const | 3553 bool RenderLayer::hasCompositedMask() const |
3532 { | 3554 { |
3533 return m_compositedLayerMapping && m_compositedLayerMapping->hasMaskLayer(); | 3555 return m_compositedLayerMapping && m_compositedLayerMapping->hasMaskLayer(); |
3534 } | 3556 } |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3870 DisableCompositingQueryAsserts disabler; | 3892 DisableCompositingQueryAsserts disabler; |
3871 if (paintsWithFilters()) | 3893 if (paintsWithFilters()) |
3872 didPaintWithFilters = true; | 3894 didPaintWithFilters = true; |
3873 updateFilters(oldStyle, renderer()->style()); | 3895 updateFilters(oldStyle, renderer()->style()); |
3874 } | 3896 } |
3875 | 3897 |
3876 // FIXME: Remove incremental compositing updates after fixing the chicken/eg
g issues | 3898 // FIXME: Remove incremental compositing updates after fixing the chicken/eg
g issues |
3877 // https://code.google.com/p/chromium/issues/detail?id=343756 | 3899 // https://code.google.com/p/chromium/issues/detail?id=343756 |
3878 DisableCompositingQueryAsserts disabler; | 3900 DisableCompositingQueryAsserts disabler; |
3879 | 3901 |
| 3902 if (RenderLayer* compositingLayer = enclosingCompositingLayer()) |
| 3903 compositingLayer->compositedLayerMapping()->setNeedsGeometryUpdate(); |
| 3904 |
3880 const RenderStyle* newStyle = renderer()->style(); | 3905 const RenderStyle* newStyle = renderer()->style(); |
3881 | 3906 |
3882 compositor()->updateLayerCompositingState(this, RenderLayerCompositor::UseCh
ickenEggHacks); | 3907 compositor()->updateLayerCompositingState(this, RenderLayerCompositor::UseCh
ickenEggHacks); |
3883 // FIXME: this compositing logic should be pushed into the compositing code,
not here. | 3908 // FIXME: this compositing logic should be pushed into the compositing code,
not here. |
3884 if (needsCompositingLayersRebuiltForClip(oldStyle, newStyle) | 3909 if (needsCompositingLayersRebuiltForClip(oldStyle, newStyle) |
3885 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) | 3910 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) |
3886 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW
ithFilters) | 3911 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW
ithFilters) |
3887 || needsCompositingLayersRebuiltForBlending(oldStyle, newStyle)) { | 3912 || needsCompositingLayersRebuiltForBlending(oldStyle, newStyle)) { |
3888 compositor()->setCompositingLayersNeedRebuild(); | 3913 compositor()->setCompositingLayersNeedRebuild(); |
3889 } | 3914 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4038 } | 4063 } |
4039 } | 4064 } |
4040 | 4065 |
4041 void showLayerTree(const WebCore::RenderObject* renderer) | 4066 void showLayerTree(const WebCore::RenderObject* renderer) |
4042 { | 4067 { |
4043 if (!renderer) | 4068 if (!renderer) |
4044 return; | 4069 return; |
4045 showLayerTree(renderer->enclosingLayer()); | 4070 showLayerTree(renderer->enclosingLayer()); |
4046 } | 4071 } |
4047 #endif | 4072 #endif |
OLD | NEW |