Changeset 294902 in webkit
- Timestamp:
- May 26, 2022, 3:22:08 PM (4 years ago)
- Location:
- trunk/Source/WebCore/rendering
- Files:
-
- 5 edited
-
RenderLayer.cpp (modified) (4 diffs)
-
RenderLayer.h (modified) (2 diffs)
-
RenderLayerCompositor.cpp (modified) (1 diff)
-
RenderObject.cpp (modified) (5 diffs)
-
RenderView.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/rendering/RenderLayer.cpp
r294699 r294902 2025 2025 } 2026 2026 2027 RenderLayer *RenderLayer::enclosingCompositingLayerForRepaint(IncludeSelfOrNot includeSelf) const2027 RenderLayer::EnclosingCompositingLayerStatus RenderLayer::enclosingCompositingLayerForRepaint(IncludeSelfOrNot includeSelf) const 2028 2028 { 2029 2029 auto repaintTargetForLayer = [](const RenderLayer& layer) -> RenderLayer* { … … 2036 2036 return nullptr; 2037 2037 }; 2038 2038 auto isEligibleForFullRepaintCheck = [&](const auto& layer) { 2039 return layer.isSelfPaintingLayer() && !layer.renderer().hasPotentiallyScrollableOverflow() && !is<RenderView>(layer.renderer()); 2040 }; 2041 2042 auto fullRepaintAlreadyScheduled = isEligibleForFullRepaintCheck(*this) && needsFullRepaint(); 2039 2043 RenderLayer* repaintTarget = nullptr; 2040 2044 if (includeSelf == IncludeSelf && (repaintTarget = repaintTargetForLayer(*this))) 2041 return repaintTarget;2045 return { fullRepaintAlreadyScheduled, repaintTarget }; 2042 2046 2043 2047 for (const RenderLayer* curr = paintOrderParent(); curr; curr = curr->paintOrderParent()) { 2048 fullRepaintAlreadyScheduled = fullRepaintAlreadyScheduled || (isEligibleForFullRepaintCheck(*curr) && curr->needsFullRepaint()); 2044 2049 if ((repaintTarget = repaintTargetForLayer(*curr))) 2045 return repaintTarget;2050 return { fullRepaintAlreadyScheduled, repaintTarget }; 2046 2051 } 2047 2052 2048 return nullptr;2053 return { }; 2049 2054 } 2050 2055 … … 4613 4618 { 4614 4619 return parent()->enclosingPaginationLayer(IncludeCompositedPaginatedLayers) != enclosingPaginationLayer(IncludeCompositedPaginatedLayers) 4615 || parent()->enclosingCompositingLayerForRepaint() != enclosingCompositingLayerForRepaint();4620 || parent()->enclosingCompositingLayerForRepaint().layer != enclosingCompositingLayerForRepaint().layer; 4616 4621 } 4617 4622 … … 5812 5817 { 5813 5818 #if ENABLE(ASYNC_SCROLLING) 5814 auto* compositingLayer = enclosingCompositingLayerForRepaint() ;5819 auto* compositingLayer = enclosingCompositingLayerForRepaint().layer; 5815 5820 5816 5821 auto shouldInvalidate = [&] { -
trunk/Source/WebCore/rendering/RenderLayer.h
r294699 r294902 591 591 // Enclosing compositing layer; if includeSelf is true, may return this. 592 592 RenderLayer* enclosingCompositingLayer(IncludeSelfOrNot = IncludeSelf) const; 593 RenderLayer* enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const; 593 struct EnclosingCompositingLayerStatus { 594 bool fullRepaintAlreadyScheduled { false }; 595 RenderLayer* layer { nullptr }; 596 }; 597 EnclosingCompositingLayerStatus enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const; 594 598 // Ancestor compositing layer, excluding this. 595 599 RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(ExcludeSelf); } … … 722 726 void setRepaintStatus(RepaintStatus status) { m_repaintStatus = status; } 723 727 RepaintStatus repaintStatus() const { return static_cast<RepaintStatus>(m_repaintStatus); } 728 bool needsFullRepaint() const { return m_repaintStatus == NeedsFullRepaint || m_repaintStatus == NeedsFullRepaintForPositionedMovementLayout; } 724 729 725 730 LayoutUnit staticInlinePosition() const { return m_offsetForPosition.width(); } -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r294699 r294902 1957 1957 void RenderLayerCompositor::repaintInCompositedAncestor(RenderLayer& layer, const LayoutRect& rect) 1958 1958 { 1959 auto* compositedAncestor = layer.enclosingCompositingLayerForRepaint(ExcludeSelf) ;1959 auto* compositedAncestor = layer.enclosingCompositingLayerForRepaint(ExcludeSelf).layer; 1960 1960 if (!compositedAncestor) 1961 1961 return; -
trunk/Source/WebCore/rendering/RenderObject.cpp
r294699 r294902 861 861 { 862 862 RenderLayerModelObject* repaintContainer = nullptr; 863 auto fullRepaintAlreadyScheduled = false; 863 864 864 865 if (view().usesCompositing()) { 865 if (RenderLayer* parentLayer = enclosingLayer()) { 866 RenderLayer* compLayer = parentLayer->enclosingCompositingLayerForRepaint(); 867 if (compLayer) 868 repaintContainer = &compLayer->renderer(); 866 if (auto* parentLayer = enclosingLayer()) { 867 auto compLayerStatus = parentLayer->enclosingCompositingLayerForRepaint(); 868 if (compLayerStatus.layer) { 869 repaintContainer = &compLayerStatus.layer->renderer(); 870 fullRepaintAlreadyScheduled = compLayerStatus.fullRepaintAlreadyScheduled; 871 } 869 872 } 870 873 } 871 874 if (view().hasSoftwareFilters()) { 872 if (RenderLayer* parentLayer = enclosingLayer()) { 873 RenderLayer* enclosingFilterLayer = parentLayer->enclosingFilterLayer(); 874 if (enclosingFilterLayer) 875 return { false, &enclosingFilterLayer->renderer() }; 875 if (auto* parentLayer = enclosingLayer()) { 876 auto* enclosingFilterLayer = parentLayer->enclosingFilterLayer(); 877 if (enclosingFilterLayer) { 878 fullRepaintAlreadyScheduled = parentLayer->needsFullRepaint(); 879 return { fullRepaintAlreadyScheduled, &enclosingFilterLayer->renderer() }; 880 } 876 881 } 877 882 } … … 888 893 repaintContainer = parentRenderFragmentedFlow; 889 894 } 890 return { f alse, repaintContainer };895 return { fullRepaintAlreadyScheduled, repaintContainer }; 891 896 } 892 897 … … 962 967 } 963 968 969 static inline bool fullRepaintIsScheduled(const RenderObject& renderer) 970 { 971 if (!renderer.view().usesCompositing() && !renderer.document().ownerElement()) 972 return false; 973 for (auto* ancestorLayer = renderer.enclosingLayer(); ancestorLayer; ancestorLayer = ancestorLayer->paintOrderParent()) { 974 if (ancestorLayer->needsFullRepaint()) 975 return true; 976 } 977 return false; 978 } 979 964 980 void RenderObject::repaint() const 965 981 { … … 973 989 974 990 auto repaintContainer = containerForRepaint(); 991 if (!repaintContainer.renderer) 992 repaintContainer = { fullRepaintIsScheduled(*this), &view }; 993 975 994 if (!repaintContainer.fullRepaintIsScheduled) 976 995 repaintUsingContainer(repaintContainer.renderer, clippedOverflowRectForRepaint(repaintContainer.renderer)); … … 993 1012 994 1013 auto repaintContainer = containerForRepaint(); 1014 if (!repaintContainer.renderer) 1015 repaintContainer = { fullRepaintIsScheduled(*this), &view }; 1016 995 1017 if (!repaintContainer.fullRepaintIsScheduled) 996 1018 repaintUsingContainer(repaintContainer.renderer, computeRectForRepaint(dirtyRect, repaintContainer.renderer), shouldClipToLayer); -
trunk/Source/WebCore/rendering/RenderView.cpp
r294699 r294902 381 381 } 382 382 383 if ( RenderLayer* compositingLayer = layer->enclosingCompositingLayerForRepaint()) {383 if (auto* compositingLayer = layer->enclosingCompositingLayerForRepaint().layer) { 384 384 if (!compositingLayer->backing()->paintsIntoWindow()) { 385 385 frameView().setCannotBlitToWindow();
Note:
See TracChangeset
for help on using the changeset viewer.