RenderLayerBacking.h [plain text]
#pragma once
#include "FloatPoint.h"
#include "FloatPoint3D.h"
#include "GraphicsLayer.h"
#include "GraphicsLayerClient.h"
#include "RenderLayer.h"
#include "RenderLayerCompositor.h"
#include "ScrollingCoordinator.h"
namespace WebCore {
class EventRegionContext;
class KeyframeList;
class PaintedContentsInfo;
class RenderLayerCompositor;
class TiledBacking;
class TransformationMatrix;
#if __WORDSIZE == 64 && PLATFORM(COCOA)
#define USE_OWNING_LAYER_BEAR_TRAP 1
#define BEAR_TRAP_VALUE 0xEEEEEEEEEEEEEEEE
#else
#define USE_OWNING_LAYER_BEAR_TRAP 0
#endif
enum CompositingLayerType {
NormalCompositingLayer, TiledCompositingLayer, MediaCompositingLayer, ContainerCompositingLayer };
class RenderLayerBacking final : public GraphicsLayerClient {
WTF_MAKE_NONCOPYABLE(RenderLayerBacking); WTF_MAKE_FAST_ALLOCATED;
public:
explicit RenderLayerBacking(RenderLayer&);
~RenderLayerBacking();
#if PLATFORM(IOS_FAMILY)
void layerWillBeDestroyed();
#endif
void willBeDestroyed();
RenderLayer& owningLayer() const { return m_owningLayer; }
const Vector<WeakPtr<RenderLayer>>& backingSharingLayers() const { return m_backingSharingLayers; }
void setBackingSharingLayers(Vector<WeakPtr<RenderLayer>>&&);
bool hasBackingSharingLayers() const { return !m_backingSharingLayers.isEmpty(); }
void removeBackingSharingLayer(RenderLayer&);
void clearBackingSharingLayers();
void updateConfigurationAfterStyleChange();
bool updateConfiguration(const RenderLayer* compositingAncestor);
void updateGeometry(const RenderLayer* compositingAncestor);
void updateAfterDescendants();
void updateDrawsContent();
void updateAfterLayout(bool needsClippingUpdate, bool needsFullRepaint);
GraphicsLayer* graphicsLayer() const { return m_graphicsLayer.get(); }
bool hasClippingLayer() const { return (m_childContainmentLayer && !m_isFrameLayerWithTiledBacking); }
GraphicsLayer* clippingLayer() const { return !m_isFrameLayerWithTiledBacking ? m_childContainmentLayer.get() : nullptr; }
bool hasAncestorClippingLayers() const { return !!m_ancestorClippingStack; }
LayerAncestorClippingStack* ancestorClippingStack() const { return m_ancestorClippingStack.get(); }
bool updateAncestorClippingStack(Vector<CompositedClipData>&&);
void ensureOverflowControlsHostLayerAncestorClippingStack(const RenderLayer* compositedAncestor);
LayerAncestorClippingStack* overflowControlsHostLayerAncestorClippingStack() const { return m_overflowControlsHostLayerAncestorClippingStack.get(); }
GraphicsLayer* contentsContainmentLayer() const { return m_contentsContainmentLayer.get(); }
GraphicsLayer* foregroundLayer() const { return m_foregroundLayer.get(); }
GraphicsLayer* backgroundLayer() const { return m_backgroundLayer.get(); }
bool backgroundLayerPaintsFixedRootBackground() const { return m_backgroundLayerPaintsFixedRootBackground; }
bool needsRepaintOnCompositedScroll() const;
bool requiresBackgroundLayer() const { return m_requiresBackgroundLayer; }
void setRequiresBackgroundLayer(bool);
bool hasScrollingLayer() const { return m_scrollContainerLayer != nullptr; }
GraphicsLayer* scrollContainerLayer() const { return m_scrollContainerLayer.get(); }
GraphicsLayer* scrolledContentsLayer() const { return m_scrolledContentsLayer.get(); }
void detachFromScrollingCoordinator(OptionSet<ScrollCoordinationRole>);
ScrollingNodeID scrollingNodeIDForRole(ScrollCoordinationRole role) const
{
switch (role) {
case ScrollCoordinationRole::Scrolling:
return m_scrollingNodeID;
case ScrollCoordinationRole::ScrollingProxy:
ASSERT_NOT_REACHED();
return 0;
case ScrollCoordinationRole::FrameHosting:
return m_frameHostingNodeID;
case ScrollCoordinationRole::ViewportConstrained:
return m_viewportConstrainedNodeID;
case ScrollCoordinationRole::Positioning:
return m_positioningNodeID;
}
return 0;
}
void setScrollingNodeIDForRole(ScrollingNodeID, ScrollCoordinationRole);
ScrollingNodeID scrollingNodeIDForChildren() const;
bool hasMaskLayer() const { return m_maskLayer; }
bool hasChildClippingMaskLayer() const { return m_childClippingMaskLayer != nullptr; }
GraphicsLayer* parentForSublayers() const;
GraphicsLayer* childForSuperlayers() const;
bool paintsIntoWindow() const;
bool paintsIntoCompositedAncestor() const { return !m_requiresOwnBackingStore; }
void setRequiresOwnBackingStore(bool);
void setContentsNeedDisplay(GraphicsLayer::ShouldClipToLayer = GraphicsLayer::ClipToLayer);
void setContentsNeedDisplayInRect(const LayoutRect&, GraphicsLayer::ShouldClipToLayer = GraphicsLayer::ClipToLayer);
void contentChanged(ContentChangeType);
bool startAnimation(double timeOffset, const Animation&, const KeyframeList&);
void animationPaused(double timeOffset, const String& name);
void animationFinished(const String& name);
void transformRelatedPropertyDidChange();
void suspendAnimations(MonotonicTime = MonotonicTime());
void resumeAnimations();
LayoutRect compositedBounds() const;
bool setCompositedBounds(const LayoutRect&);
bool updateCompositedBounds();
void updateAllowsBackingStoreDetaching(const LayoutRect& absoluteBounds);
#if ENABLE(ASYNC_SCROLLING)
bool maintainsEventRegion() const;
void updateEventRegion();
bool needsEventRegionUpdate() const { return m_needsEventRegionUpdate; }
void setNeedsEventRegionUpdate(bool needsUpdate = true) { m_needsEventRegionUpdate = needsUpdate; }
#endif
void updateAfterWidgetResize();
void positionOverflowControlsLayers();
bool isFrameLayerWithTiledBacking() const { return m_isFrameLayerWithTiledBacking; }
WEBCORE_EXPORT TiledBacking* tiledBacking() const;
void adjustTiledBackingCoverage();
void setTiledBackingHasMargins(bool hasExtendedBackgroundOnLeftAndRight, bool hasExtendedBackgroundOnTopAndBottom);
void updateDebugIndicators(bool showBorder, bool showRepaintCounter);
bool paintsSubpixelAntialiasedText() const { return m_paintsSubpixelAntialiasedText; }
void tiledBackingUsageChanged(const GraphicsLayer*, bool ) override;
void notifyAnimationStarted(const GraphicsLayer*, const String& animationKey, MonotonicTime startTime) override;
void notifyFlushRequired(const GraphicsLayer*) override;
void notifyFlushBeforeDisplayRefresh(const GraphicsLayer*) override;
void paintContents(const GraphicsLayer*, GraphicsContext&, const FloatRect& clip, GraphicsLayerPaintBehavior) override;
float deviceScaleFactor() const override;
float contentsScaleMultiplierForNewTiles(const GraphicsLayer*) const override;
bool paintsOpaquelyAtNonIntegralScales(const GraphicsLayer*) const override;
float pageScaleFactor() const override;
float zoomedOutPageScaleFactor() const override;
void didChangePlatformLayerForLayer(const GraphicsLayer*) override;
bool getCurrentTransform(const GraphicsLayer*, TransformationMatrix&) const override;
bool isTrackingRepaints() const override;
bool shouldSkipLayerInDump(const GraphicsLayer*, LayerTreeAsTextBehavior) const override;
bool shouldDumpPropertyForLayer(const GraphicsLayer*, const char* propertyName, LayerTreeAsTextBehavior) const override;
bool shouldAggressivelyRetainTiles(const GraphicsLayer*) const override;
bool shouldTemporarilyRetainTileCohorts(const GraphicsLayer*) const override;
bool useGiantTiles() const override;
void logFilledVisibleFreshTile(unsigned) override;
bool needsPixelAligment() const override { return !m_isMainFrameRenderViewLayer; }
LayoutSize subpixelOffsetFromRenderer() const { return m_subpixelOffsetFromRenderer; }
TransformationMatrix transformMatrixForProperty(AnimatedPropertyID) const final;
#if PLATFORM(IOS_FAMILY)
bool needsIOSDumpRenderTreeMainFrameRenderViewLayerIsAlwaysOpaqueHack(const GraphicsLayer&) const override;
#endif
#ifndef NDEBUG
void verifyNotPainting() override;
#endif
WEBCORE_EXPORT LayoutRect contentsBox() const;
WEBCORE_EXPORT CompositingLayerType compositingLayerType() const;
GraphicsLayer* layerForHorizontalScrollbar() const { return m_layerForHorizontalScrollbar.get(); }
GraphicsLayer* layerForVerticalScrollbar() const { return m_layerForVerticalScrollbar.get(); }
GraphicsLayer* layerForScrollCorner() const { return m_layerForScrollCorner.get(); }
GraphicsLayer* overflowControlsContainer() const { return m_overflowControlsContainer.get(); }
void adjustOverflowControlsPositionRelativeToAncestor(const RenderLayer&);
bool canCompositeFilters() const { return m_canCompositeFilters; }
#if ENABLE(FILTERS_LEVEL_2)
bool canCompositeBackdropFilters() const { return m_canCompositeBackdropFilters; }
#endif
WEBCORE_EXPORT double backingStoreMemoryEstimate() const;
WEBCORE_EXPORT void setUsesDisplayListDrawing(bool);
WEBCORE_EXPORT String displayListAsText(DisplayList::AsTextFlags) const;
WEBCORE_EXPORT void setIsTrackingDisplayListReplay(bool);
WEBCORE_EXPORT String replayDisplayListAsText(DisplayList::AsTextFlags) const;
private:
friend class PaintedContentsInfo;
FloatRect backgroundBoxForSimpleContainerPainting() const;
void createPrimaryGraphicsLayer();
void destroyGraphicsLayers();
void willDestroyLayer(const GraphicsLayer*);
LayoutRect compositedBoundsIncludingMargin() const;
Ref<GraphicsLayer> createGraphicsLayer(const String&, GraphicsLayer::Type = GraphicsLayer::Type::Normal);
RenderLayerModelObject& renderer() const { return m_owningLayer.renderer(); }
RenderBox* renderBox() const { return m_owningLayer.renderBox(); }
RenderLayerCompositor& compositor() const { return m_owningLayer.compositor(); }
void updateInternalHierarchy();
bool updateAncestorClipping(bool needsAncestorClip, const RenderLayer* compositingAncestor);
bool updateDescendantClippingLayer(bool needsDescendantClip);
bool updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool needsVerticalScrollbarLayer, bool needsScrollCornerLayer);
bool updateForegroundLayer(bool needsForegroundLayer);
bool updateBackgroundLayer(bool needsBackgroundLayer);
bool updateMaskingLayer(bool hasMask, bool hasClipPath);
bool requiresLayerForScrollbar(Scrollbar*) const;
bool requiresHorizontalScrollbarLayer() const;
bool requiresVerticalScrollbarLayer() const;
bool requiresScrollCornerLayer() const;
bool updateScrollingLayers(bool scrollingLayers);
void updateScrollOffset(ScrollOffset);
void setLocationOfScrolledContents(ScrollOffset, ScrollingLayerPositionAction);
void updateChildClippingStrategy(bool needsDescendantsClippingLayer);
void updateMaskingLayerGeometry();
void updateRootLayerConfiguration();
void updatePaintingPhases();
void setBackgroundLayerPaintsFixedRootBackground(bool);
LayoutSize contentOffsetInCompositingLayer() const;
FloatPoint3D computeTransformOriginForPainting(const LayoutRect& borderBox) const;
LayoutSize offsetRelativeToRendererOriginForDescendantLayers() const;
void ensureClippingStackLayers(LayerAncestorClippingStack&);
void removeClippingStackLayers(LayerAncestorClippingStack&);
void updateClippingStackLayerGeometry(LayerAncestorClippingStack&, const RenderLayer* compositedAncestor, LayoutRect& parentGraphicsLayerRect);
void connectClippingStackLayers(LayerAncestorClippingStack&);
void updateOpacity(const RenderStyle&);
void updateTransform(const RenderStyle&);
void updateChildrenTransformAndAnchorPoint(const LayoutRect& primaryGraphicsLayerRect, LayoutSize offsetFromParentGraphicsLayer);
void updateFilters(const RenderStyle&);
#if ENABLE(FILTERS_LEVEL_2)
void updateBackdropFilters(const RenderStyle&);
void updateBackdropFiltersGeometry();
#endif
#if ENABLE(CSS_COMPOSITING)
void updateBlendMode(const RenderStyle&);
#endif
void updateCustomAppearance(const RenderStyle&);
float compositingOpacity(float rendererOpacity) const;
Color rendererBackgroundColor() const;
bool isMainFrameRenderViewLayer() const;
bool paintsBoxDecorations() const;
bool paintsContent(RenderLayer::PaintedContentRequest&) const;
void updateDrawsContent(PaintedContentsInfo&);
bool isSimpleContainerCompositingLayer(PaintedContentsInfo&) const;
bool containsPaintedContent(PaintedContentsInfo&) const;
bool isDirectlyCompositedImage() const;
void updateImageContents(PaintedContentsInfo&);
void updateDirectlyCompositedBoxDecorations(PaintedContentsInfo&, bool& didUpdateContentsRect);
void updateDirectlyCompositedBackgroundColor(PaintedContentsInfo&, bool& didUpdateContentsRect);
void updateDirectlyCompositedBackgroundImage(PaintedContentsInfo&, bool& didUpdateContentsRect);
void resetContentsRect();
void updateContentsRects();
bool isPaintDestinationForDescendantLayers(RenderLayer::PaintedContentRequest&) const;
bool hasVisibleNonCompositedDescendants() const;
bool shouldClipCompositedBounds() const;
bool hasTiledBackingFlatteningLayer() const { return (m_childContainmentLayer && m_isFrameLayerWithTiledBacking); }
GraphicsLayer* tileCacheFlatteningLayer() const { return m_isFrameLayerWithTiledBacking ? m_childContainmentLayer.get() : nullptr; }
void paintIntoLayer(const GraphicsLayer*, GraphicsContext&, const IntRect& paintDirtyRect, OptionSet<PaintBehavior>, EventRegionContext* = nullptr);
OptionSet<RenderLayer::PaintLayerFlag> paintFlagsForLayer(const GraphicsLayer&) const;
void paintDebugOverlays(const GraphicsLayer*, GraphicsContext&);
static CSSPropertyID graphicsLayerToCSSProperty(AnimatedPropertyID);
static AnimatedPropertyID cssToGraphicsLayerProperty(CSSPropertyID);
bool canIssueSetNeedsDisplay() const { return !paintsIntoWindow() && !paintsIntoCompositedAncestor(); }
LayoutRect computeParentGraphicsLayerRect(const RenderLayer* compositedAncestor) const;
LayoutRect computePrimaryGraphicsLayerRect(const RenderLayer* compositedAncestor, const LayoutRect& parentGraphicsLayerRect) const;
#if USE(OWNING_LAYER_BEAR_TRAP)
uintptr_t m_owningLayerBearTrap { BEAR_TRAP_VALUE }; #endif
RenderLayer& m_owningLayer;
Vector<WeakPtr<RenderLayer>> m_backingSharingLayers;
std::unique_ptr<LayerAncestorClippingStack> m_ancestorClippingStack; std::unique_ptr<LayerAncestorClippingStack> m_overflowControlsHostLayerAncestorClippingStack;
RefPtr<GraphicsLayer> m_contentsContainmentLayer; RefPtr<GraphicsLayer> m_graphicsLayer;
RefPtr<GraphicsLayer> m_foregroundLayer; RefPtr<GraphicsLayer> m_backgroundLayer; RefPtr<GraphicsLayer> m_childContainmentLayer; RefPtr<GraphicsLayer> m_maskLayer; RefPtr<GraphicsLayer> m_childClippingMaskLayer;
RefPtr<GraphicsLayer> m_layerForHorizontalScrollbar;
RefPtr<GraphicsLayer> m_layerForVerticalScrollbar;
RefPtr<GraphicsLayer> m_layerForScrollCorner;
RefPtr<GraphicsLayer> m_overflowControlsContainer;
RefPtr<GraphicsLayer> m_scrollContainerLayer; RefPtr<GraphicsLayer> m_scrolledContentsLayer;
LayoutRect m_compositedBounds;
LayoutSize m_subpixelOffsetFromRenderer; LayoutSize m_compositedBoundsOffsetFromGraphicsLayer;
ScrollingNodeID m_viewportConstrainedNodeID { 0 };
ScrollingNodeID m_scrollingNodeID { 0 };
ScrollingNodeID m_frameHostingNodeID { 0 };
ScrollingNodeID m_positioningNodeID { 0 };
bool m_artificiallyInflatedBounds { false }; bool m_isMainFrameRenderViewLayer { false };
bool m_isFrameLayerWithTiledBacking { false };
bool m_requiresOwnBackingStore { true };
bool m_canCompositeFilters { false };
#if ENABLE(FILTERS_LEVEL_2)
bool m_canCompositeBackdropFilters { false };
#endif
bool m_backgroundLayerPaintsFixedRootBackground { false };
bool m_requiresBackgroundLayer { false };
bool m_hasSubpixelRounding { false };
bool m_paintsSubpixelAntialiasedText { false }; #if ENABLE(ASYNC_SCROLLING)
bool m_needsEventRegionUpdate { true };
#endif
};
enum CanvasCompositingStrategy {
UnacceleratedCanvas,
CanvasPaintedToLayer,
CanvasAsLayerContents
};
CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject&);
WTF::TextStream& operator<<(WTF::TextStream&, const RenderLayerBacking&);
}