#ifndef RenderLayer_h
#define RenderLayer_h
#include "core/rendering/compositing/CompositedLayerMappingPtr.h"
#include "core/rendering/LayerPaintingInfo.h"
#include "core/rendering/RenderBox.h"
#include "core/rendering/RenderLayerBlendInfo.h"
#include "core/rendering/RenderLayerClipper.h"
#include "core/rendering/RenderLayerFilterInfo.h"
#include "core/rendering/RenderLayerReflectionInfo.h"
#include "core/rendering/RenderLayerRepainter.h"
#include "core/rendering/RenderLayerScrollableArea.h"
#include "core/rendering/RenderLayerStackingNode.h"
#include "core/rendering/RenderLayerStackingNodeIterator.h"
#include "platform/graphics/CompositingReasons.h"
#include "wtf/OwnPtr.h"
namespace WebCore {
class FilterEffectRenderer;
class FilterOperations;
class HitTestRequest;
class HitTestResult;
class HitTestingTransformState;
class RenderFlowThread;
class RenderGeometryMap;
class CompositedLayerMapping;
class RenderLayerCompositor;
class RenderReplica;
class RenderStyle;
class TransformationMatrix;
enum BorderRadiusClippingRule { IncludeSelfForBorderRadius, DoNotIncludeSelfForBorderRadius };
enum IncludeSelfOrNot { IncludeSelf, ExcludeSelf };
enum CompositedScrollingHistogramBuckets {
IsScrollableAreaBucket = 0,
NeedsToBeStackingContainerBucket = 1,
WillUseCompositedScrollingBucket = 2,
CompositedScrollingHistogramMax = 3
};
enum CompositingQueryMode {
CompositingQueriesAreAllowed,
CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases
};
class DisableCompositingQueryAsserts {
WTF_MAKE_NONCOPYABLE(DisableCompositingQueryAsserts);
public:
DisableCompositingQueryAsserts();
private:
TemporaryChange<CompositingQueryMode> m_disabler;
};
class RenderLayer {
WTF_MAKE_NONCOPYABLE(RenderLayer);
public:
RenderLayer(RenderLayerModelObject*, LayerType);
~RenderLayer();
String debugName() const;
RenderLayerModelObject* renderer() const { return m_renderer; }
RenderBox* renderBox() const { return m_renderer && m_renderer->isBox() ? toRenderBox(m_renderer) : 0; }
RenderLayer* parent() const { return m_parent; }
RenderLayer* previousSibling() const { return m_previous; }
RenderLayer* nextSibling() const { return m_next; }
RenderLayer* firstChild() const { return m_first; }
RenderLayer* lastChild() const { return m_last; }
const RenderLayer* compositingContainer() const;
void addChild(RenderLayer* newChild, RenderLayer* beforeChild = 0);
RenderLayer* removeChild(RenderLayer*);
void removeOnlyThisLayer();
void insertOnlyThisLayer();
void styleChanged(StyleDifference, const RenderStyle* oldStyle);
bool isSelfPaintingLayer() const { return m_isSelfPaintingLayer; }
bool isOverflowOnlyLayer() const { return m_layerType == OverflowClipLayer; }
bool isForcedLayer() const { return m_layerType == ForcedLayer; }
void setLayerType(LayerType layerType) { m_layerType = layerType; }
bool cannotBlitToWindow() const;
bool isTransparent() const;
RenderLayer* transparentPaintingAncestor();
void beginTransparencyLayers(GraphicsContext*, const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior);
bool isReflection() const { return renderer()->isReplica(); }
RenderLayerReflectionInfo* reflectionInfo() { return m_reflectionInfo.get(); }
const RenderLayerReflectionInfo* reflectionInfo() const { return m_reflectionInfo.get(); }
const RenderLayer* root() const
{
const RenderLayer* curr = this;
while (curr->parent())
curr = curr->parent();
return curr;
}
const LayoutPoint& location() const { return m_topLeft; }
void setLocation(const LayoutPoint& p) { m_topLeft = p; }
const IntSize& size() const { return m_layerSize; }
void setSize(const IntSize& size) { m_layerSize = size; }
LayoutRect rect() const { return LayoutRect(location(), size()); }
bool isRootLayer() const { return m_isRootLayer; }
RenderLayerCompositor* compositor() const;
void contentChanged(ContentChangeType);
bool canRender3DTransforms() const;
enum UpdateLayerPositionsFlag {
CheckForRepaint = 1 << 0,
NeedsFullRepaintInBacking = 1 << 1,
UpdatePagination = 1 << 2,
};
typedef unsigned UpdateLayerPositionsFlags;
void updateLayerPositionsAfterLayout(const RenderLayer* rootLayer, UpdateLayerPositionsFlags);
void updateLayerPositionsAfterOverflowScroll();
void updateLayerPositionsAfterDocumentScroll();
void updateLayerPositions(RenderGeometryMap*, UpdateLayerPositionsFlags = CheckForRepaint);
bool isPaginated() const { return m_isPaginated; }
RenderLayer* enclosingPaginationLayer() const { return m_enclosingPaginationLayer; }
void updateTransform();
RenderLayer* renderingContextRoot();
const LayoutSize& offsetForInFlowPosition() const { return m_offsetForInFlowPosition; }
void addBlockSelectionGapsBounds(const LayoutRect&);
void clearBlockSelectionGapsBounds();
void repaintBlockSelectionGaps();
bool hasBlockSelectionGapBounds() const;
RenderLayerStackingNode* stackingNode() { return m_stackingNode.get(); }
const RenderLayerStackingNode* stackingNode() const { return m_stackingNode.get(); }
bool subtreeIsInvisible() const { return !hasVisibleContent() && !hasVisibleDescendant(); }
bool hasVisibleContent() const { return m_hasVisibleContent; }
bool hasVisibleDescendant() const { return m_hasVisibleDescendant; }
void setHasVisibleContent();
void dirtyVisibleContentStatus();
bool hasBoxDecorationsOrBackground() const;
bool hasVisibleBoxDecorations() const;
bool isVisuallyNonEmpty() const;
bool hasNonEmptyChildRenderers() const;
bool hasSelfPaintingLayerDescendant() const { return m_hasSelfPaintingLayerDescendant; }
bool hasOutOfFlowPositionedDescendant() const { return m_hasOutOfFlowPositionedDescendant; }
void setHasOutOfFlowPositionedDescendant(bool hasDescendant) { m_hasOutOfFlowPositionedDescendant = hasDescendant; }
void setHasOutOfFlowPositionedDescendantDirty(bool dirty) { m_hasOutOfFlowPositionedDescendantDirty = dirty; }
bool hasUnclippedDescendant() const { return m_hasUnclippedDescendant; }
void setHasUnclippedDescendant(bool hasDescendant) { m_hasUnclippedDescendant = hasDescendant; }
void updateHasUnclippedDescendant();
bool isUnclippedDescendant() const { return m_isUnclippedDescendant; }
bool hasVisibleNonLayerContent() const { return m_hasVisibleNonLayerContent; }
void updateHasVisibleNonLayerContent();
bool usedTransparency() const { return m_usedTransparency; }
RenderLayer* enclosingPositionedAncestor() const;
RenderLayer* enclosingOverflowClipLayer(IncludeSelfOrNot = IncludeSelf) const;
RenderLayer* enclosingCompositingLayer(IncludeSelfOrNot = IncludeSelf) const;
RenderLayer* enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const;
RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(ExcludeSelf); }
RenderLayer* ancestorCompositedScrollingLayer() const;
RenderLayer* ancestorScrollingLayer() const;
RenderLayer* enclosingFilterLayer(IncludeSelfOrNot = IncludeSelf) const;
RenderLayer* enclosingFilterRepaintLayer() const;
bool hasAncestorWithFilterOutsets() const;
bool canUseConvertToLayerCoords() const
{
return !renderer()->hasColumns() && !renderer()->hasTransform() && !renderer()->isSVGRoot();
}
void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntPoint& location) const;
void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntRect&) const;
void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutPoint& location) const;
void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutRect&) const;
void paint(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior = PaintBehaviorNormal, RenderObject* paintingRoot = 0, PaintLayerFlags = 0);
bool hitTest(const HitTestRequest&, HitTestResult&);
bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&);
void paintOverlayScrollbars(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior, RenderObject* paintingRoot = 0);
bool intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot = 0) const;
enum CalculateLayerBoundsFlag {
IncludeSelfTransform = 1 << 0,
UseLocalClipRectIfPossible = 1 << 1,
IncludeLayerFilterOutsets = 1 << 2,
ExcludeHiddenDescendants = 1 << 3,
IncludeCompositedDescendants = 1 << 4,
PretendLayerHasOwnBacking = 1 << 5,
DefaultCalculateLayerBoundsFlags = IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets
};
typedef unsigned CalculateLayerBoundsFlags;
LayoutRect physicalBoundingBox(const RenderLayer* ancestorLayer, const LayoutPoint* offsetFromRoot = 0) const;
LayoutRect overlapBounds() const { return overlapBoundsIncludeChildren() ? calculateLayerBounds(this) : logicalBoundingBox(); }
bool overlapBoundsIncludeChildren() const { return hasFilter() && renderer()->style()->filter().hasFilterThatMovesPixels(); }
LayoutRect calculateLayerBounds(const RenderLayer* ancestorLayer, const LayoutPoint* offsetFromRoot = 0, CalculateLayerBoundsFlags = DefaultCalculateLayerBoundsFlags) const;
LayoutPoint computeOffsetFromRoot(bool& hasLayerOffset) const;
LayoutUnit staticInlinePosition() const { return m_staticInlinePosition; }
LayoutUnit staticBlockPosition() const { return m_staticBlockPosition; }
void setStaticInlinePosition(LayoutUnit position) { m_staticInlinePosition = position; }
void setStaticBlockPosition(LayoutUnit position) { m_staticBlockPosition = position; }
LayoutSize subpixelAccumulation() const;
void setSubpixelAccumulation(const LayoutSize&);
bool hasTransform() const { return renderer()->hasTransform(); }
TransformationMatrix* transform() const { return m_transform.get(); }
TransformationMatrix currentTransform(RenderStyle::ApplyTransformOrigin = RenderStyle::IncludeTransformOrigin) const;
TransformationMatrix renderableTransform(PaintBehavior) const;
TransformationMatrix perspectiveTransform() const;
FloatPoint perspectiveOrigin() const;
bool preserves3D() const { return renderer()->style()->transformStyle3D() == TransformStyle3DPreserve3D; }
bool has3DTransform() const { return m_transform && !m_transform->isAffine(); }
bool shouldPreserve3D() const { return !renderer()->hasReflection() && renderer()->style()->transformStyle3D() == TransformStyle3DPreserve3D; }
void filterNeedsRepaint();
bool hasFilter() const { return renderer()->hasFilter(); }
bool paintsWithBlendMode() const;
void* operator new(size_t);
void operator delete(void*);
CompositingState compositingState() const;
bool isAllowedToQueryCompositingState() const;
bool isInCompositingUpdate() const;
CompositedLayerMappingPtr compositedLayerMapping() const;
CompositedLayerMappingPtr ensureCompositedLayerMapping();
bool hasCompositedLayerMapping() const { return m_compositedLayerMapping.get(); }
void clearCompositedLayerMapping(bool layerBeingDestroyed = false);
CompositedLayerMapping* groupedMapping() const { return m_groupedMapping; }
void setGroupedMapping(CompositedLayerMapping* groupedMapping, bool layerBeingDestroyed = false);
bool hasCompositedMask() const;
bool hasCompositedClippingMask() const;
bool needsCompositedScrolling() const { return m_scrollableArea && m_scrollableArea->needsCompositedScrolling(); }
bool clipsCompositingDescendantsWithBorderRadius() const;
RenderLayer* scrollParent() const;
RenderLayer* clipParent() const;
bool needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const;
bool needsCompositingLayersRebuiltForOverflow(const RenderStyle* oldStyle, const RenderStyle* newStyle) const;
bool needsCompositingLayersRebuiltForFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle, bool didPaintWithFilters) const;
bool needsCompositingLayersRebuiltForBlending(const RenderStyle* oldStyle, const RenderStyle* newStyle) const;
bool paintsWithTransparency(PaintBehavior paintBehavior) const
{
return isTransparent() && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || compositingState() != PaintsIntoOwnBacking);
}
bool paintsWithTransform(PaintBehavior) const;
bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const;
bool containsDirtyOverlayScrollbars() const { return m_containsDirtyOverlayScrollbars; }
void setContainsDirtyOverlayScrollbars(bool dirtyScrollbars) { m_containsDirtyOverlayScrollbars = dirtyScrollbars; }
FilterOperations computeFilterOperations(const RenderStyle*);
bool paintsWithFilters() const;
bool requiresFullLayerImageForFilters() const;
FilterEffectRenderer* filterRenderer() const
{
RenderLayerFilterInfo* filterInfo = this->filterInfo();
return filterInfo ? filterInfo->renderer() : 0;
}
RenderLayerFilterInfo* filterInfo() const { return hasFilterInfo() ? RenderLayerFilterInfo::filterInfoForRenderLayer(this) : 0; }
RenderLayerFilterInfo* ensureFilterInfo() { return RenderLayerFilterInfo::createFilterInfoForRenderLayerIfNeeded(this); }
void removeFilterInfoIfNeeded()
{
if (hasFilterInfo())
RenderLayerFilterInfo::removeFilterInfoForRenderLayer(this);
}
bool hasFilterInfo() const { return m_hasFilterInfo; }
void setHasFilterInfo(bool hasFilterInfo) { m_hasFilterInfo = hasFilterInfo; }
void updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle);
Node* enclosingElement() const;
bool isInTopLayer() const;
bool isInTopLayerSubtree() const;
enum ViewportConstrainedNotCompositedReason {
NoNotCompositedReason = 0,
NotCompositedForBoundsOutOfView,
NotCompositedForNonViewContainer,
NotCompositedForNoVisibleContent,
NotCompositedForUnscrollableAncestors,
NumNotCompositedReasons,
ViewportConstrainedNotCompositedReasonBits = 3
};
void setViewportConstrainedNotCompositedReason(ViewportConstrainedNotCompositedReason reason) { m_compositingProperties.viewportConstrainedNotCompositedReason = reason; }
ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason() const { return static_cast<ViewportConstrainedNotCompositedReason>(m_compositingProperties.viewportConstrainedNotCompositedReason); }
bool isOutOfFlowRenderFlowThread() const { return renderer()->isOutOfFlowRenderFlowThread(); }
bool scrollsWithRespectTo(const RenderLayer*) const;
void addLayerHitTestRects(LayerHitTestRects&) const;
void computeSelfHitTestRects(LayerHitTestRects&) const;
RenderLayerScrollableArea* scrollableArea() const { return m_scrollableArea.get(); }
RenderLayerRepainter& repainter() { return m_repainter; }
RenderLayerClipper& clipper() { return m_clipper; }
const RenderLayerClipper& clipper() const { return m_clipper; }
inline bool isPositionedContainer() const
{
RenderLayerModelObject* layerRenderer = renderer();
return isRootLayer() || layerRenderer->isPositioned() || hasTransform();
}
void paintLayer(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
PassOwnPtr<Vector<FloatRect> > collectTrackedRepaintRects() const;
RenderLayerBlendInfo& blendInfo() { return m_blendInfo; }
void setOffsetFromSquashingLayerOrigin(IntSize offset) { m_compositingProperties.offsetFromSquashingLayerOrigin = offset; }
IntSize offsetFromSquashingLayerOrigin() const { return m_compositingProperties.offsetFromSquashingLayerOrigin; }
bool scrollsOverflow() const;
bool hasDirectReasonsForCompositing() const { return compositingReasons() & CompositingReasonComboAllDirectReasons; }
CompositingReasons styleDeterminedCompositingReasons() const { return compositingReasons() & CompositingReasonComboAllStyleDeterminedReasons; }
void clearAncestorDependentPropertyCache();
class AncestorDependentProperties {
public:
IntRect clippedAbsoluteBoundingBox;
};
void setNeedsToUpdateAncestorDependentProperties();
bool childNeedsToUpdateAncestorDependantProperties() const { return m_childNeedsToUpdateAncestorDependantProperties; }
bool needsToUpdateAncestorDependentProperties() const { return m_needsToUpdateAncestorDependentProperties; }
void updateAncestorDependentProperties(const AncestorDependentProperties&);
void clearChildNeedsToUpdateAncestorDependantProperties();
const AncestorDependentProperties& ancestorDependentProperties() { ASSERT(!m_needsToUpdateAncestorDependentProperties); return m_ancestorDependentProperties; }
bool lostGroupedMapping() const { return m_compositingProperties.lostGroupedMapping; }
void setLostGroupedMapping(bool b) { m_compositingProperties.lostGroupedMapping = b; }
CompositingReasons compositingReasons() const { return m_compositingProperties.compositingReasons; }
void setCompositingReasons(CompositingReasons, CompositingReasons mask = CompositingReasonAll);
bool hasCompositingDescendant() const { return m_compositingProperties.hasCompositingDescendant; }
void setHasCompositingDescendant(bool b) { m_compositingProperties.hasCompositingDescendant = b; }
bool hasNonCompositedChild() const { return m_compositingProperties.hasNonCompositedChild; }
void setHasNonCompositedChild(bool b) { m_compositingProperties.hasNonCompositedChild = b; }
bool shouldIsolateCompositedDescendants() const { return m_compositingProperties.shouldIsolateCompositedDescendants; }
void setShouldIsolateCompositedDescendants(bool b) { m_compositingProperties.shouldIsolateCompositedDescendants = b; }
void updateDescendantDependentFlags();
void updateOrRemoveFilterEffectRenderer();
void updateSelfPaintingLayer();
void paintLayerContents(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
RenderLayer* enclosingTransformedAncestor() const;
void didUpdateNeedsCompositedScrolling();
private:
class AncestorDependentPropertyCache {
WTF_MAKE_NONCOPYABLE(AncestorDependentPropertyCache);
public:
AncestorDependentPropertyCache();
RenderLayer* ancestorCompositedScrollingLayer() const;
void setAncestorCompositedScrollingLayer(RenderLayer*);
RenderLayer* scrollParent() const;
void setScrollParent(RenderLayer*);
bool ancestorCompositedScrollingLayerDirty() const { return m_ancestorCompositedScrollingLayerDirty; }
bool scrollParentDirty() const { return m_scrollParentDirty; }
private:
RenderLayer* m_ancestorCompositedScrollingLayer;
RenderLayer* m_scrollParent;
bool m_ancestorCompositedScrollingLayerDirty;
bool m_scrollParentDirty;
};
void ensureAncestorDependentPropertyCache() const;
LayoutRect logicalBoundingBox() const;
bool hasOverflowControls() const;
void setIsUnclippedDescendant(bool isUnclippedDescendant) { m_isUnclippedDescendant = isUnclippedDescendant; }
void setAncestorChainHasSelfPaintingLayerDescendant();
void dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
void setAncestorChainHasOutOfFlowPositionedDescendant();
void dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
void clipToRect(const LayerPaintingInfo&, GraphicsContext*, const ClipRect&, BorderRadiusClippingRule = IncludeSelfForBorderRadius);
void restoreClip(GraphicsContext*, const LayoutRect& paintDirtyRect, const ClipRect&);
void updateOutOfFlowPositioned(const RenderStyle* oldStyle);
bool updateLayerPosition();
enum UpdateLayerPositionsAfterScrollFlag {
NoFlag = 0,
IsOverflowScroll = 1 << 0,
HasSeenViewportConstrainedAncestor = 1 << 1,
HasSeenAncestorWithOverflowClip = 1 << 2,
HasChangedAncestor = 1 << 3
};
typedef unsigned UpdateLayerPositionsAfterScrollFlags;
void updateLayerPositionsAfterScroll(RenderGeometryMap*, UpdateLayerPositionsAfterScrollFlags = NoFlag);
void setNextSibling(RenderLayer* next) { m_next = next; }
void setPreviousSibling(RenderLayer* prev) { m_previous = prev; }
void setParent(RenderLayer* parent);
void setFirstChild(RenderLayer* first) { m_first = first; }
void setLastChild(RenderLayer* last) { m_last = last; }
LayoutPoint renderBoxLocation() const { return renderer()->isBox() ? toRenderBox(renderer())->location() : LayoutPoint(); }
void paintLayerContentsAndReflection(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
void paintLayerByApplyingTransform(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const LayoutPoint& translationOffset = LayoutPoint());
void paintChildren(unsigned childrenToVisit, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
void paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
void paintChildLayerIntoColumns(RenderLayer* childLayer, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const Vector<RenderLayer*>& columnLayers, size_t columnIndex);
void collectFragments(LayerFragments&, const RenderLayer* rootLayer, const LayoutRect& dirtyRect,
ClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize,
ShouldRespectOverflowClip = RespectOverflowClip, const LayoutPoint* offsetFromRoot = 0,
const LayoutSize& subPixelAccumulation = LayoutSize(), const LayoutRect* layerBoundingBox = 0);
void updatePaintingInfoForFragments(LayerFragments&, const LayerPaintingInfo&, PaintLayerFlags, bool shouldPaintContent, const LayoutPoint* offsetFromRoot);
void paintBackgroundForFragments(const LayerFragments&, GraphicsContext*, GraphicsContext* transparencyLayerContext,
const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer);
void paintForegroundForFragments(const LayerFragments&, GraphicsContext*, GraphicsContext* transparencyLayerContext,
const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer,
bool selectionOnly, bool forceBlackText);
void paintForegroundForFragmentsWithPhase(PaintPhase, const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer);
void paintOutlineForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer);
void paintOverflowControlsForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&);
void paintMaskForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, RenderObject* paintingRootForRenderer);
void paintChildClippingMaskForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, RenderObject* paintingRootForRenderer);
void paintTransformedLayerIntoFragments(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
RenderLayer* hitTestLayer(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result,
const LayoutRect& hitTestRect, const HitTestLocation&, bool appliedTransform,
const HitTestingTransformState* transformState = 0, double* zOffset = 0);
RenderLayer* hitTestLayerByApplyingTransform(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest&, HitTestResult&,
const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = 0, double* zOffset = 0,
const LayoutPoint& translationOffset = LayoutPoint());
RenderLayer* hitTestChildren(ChildrenIteration, RenderLayer* rootLayer, const HitTestRequest&, HitTestResult&,
const LayoutRect& hitTestRect, const HitTestLocation&,
const HitTestingTransformState* transformState, double* zOffsetForDescendants, double* zOffset,
const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants);
RenderLayer* hitTestPaginatedChildLayer(RenderLayer* childLayer, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result,
const LayoutRect& hitTestRect, const HitTestLocation&,
const HitTestingTransformState* transformState, double* zOffset);
RenderLayer* hitTestChildLayerColumns(RenderLayer* childLayer, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result,
const LayoutRect& hitTestRect, const HitTestLocation&,
const HitTestingTransformState* transformState, double* zOffset,
const Vector<RenderLayer*>& columnLayers, size_t columnIndex);
PassRefPtr<HitTestingTransformState> createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer,
const LayoutRect& hitTestRect, const HitTestLocation&,
const HitTestingTransformState* containerTransformState,
const LayoutPoint& translationOffset = LayoutPoint()) const;
bool hitTestContents(const HitTestRequest&, HitTestResult&, const LayoutRect& layerBounds, const HitTestLocation&, HitTestFilter) const;
bool hitTestContentsForFragments(const LayerFragments&, const HitTestRequest&, HitTestResult&, const HitTestLocation&, HitTestFilter, bool& insideClipRect) const;
RenderLayer* hitTestTransformedLayerInFragments(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest&, HitTestResult&,
const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = 0, double* zOffset = 0);
bool childBackgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const;
bool shouldBeSelfPaintingLayer() const;
bool requiresStackingNode() const { return true; }
void updateStackingNode();
void updateReflectionInfo(const RenderStyle*);
bool requiresScrollableArea() const { return renderBox(); }
void updateScrollableArea();
void dirtyAncestorChainVisibleDescendantStatus();
void setAncestorChainHasVisibleDescendant();
void dirty3DTransformedDescendantStatus();
bool update3DTransformedDescendantStatus();
void updateOrRemoveFilterClients();
LayoutRect paintingExtent(const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior);
void updatePagination();
bool useRegionBasedColumns() const;
LayerType m_layerType;
unsigned m_isSelfPaintingLayer : 1;
unsigned m_hasSelfPaintingLayerDescendant : 1;
unsigned m_hasSelfPaintingLayerDescendantDirty : 1;
unsigned m_hasOutOfFlowPositionedDescendant : 1;
unsigned m_hasOutOfFlowPositionedDescendantDirty : 1;
unsigned m_hasUnclippedDescendant : 1;
unsigned m_isUnclippedDescendant : 1;
const unsigned m_isRootLayer : 1;
unsigned m_usedTransparency : 1;
unsigned m_visibleContentStatusDirty : 1;
unsigned m_hasVisibleContent : 1;
unsigned m_visibleDescendantStatusDirty : 1;
unsigned m_hasVisibleDescendant : 1;
unsigned m_hasVisibleNonLayerContent : 1;
unsigned m_isPaginated : 1;
unsigned m_3DTransformedDescendantStatusDirty : 1;
unsigned m_has3DTransformedDescendant : 1;
unsigned m_containsDirtyOverlayScrollbars : 1;
const unsigned m_canSkipRepaintRectsUpdateOnScroll : 1;
unsigned m_hasFilterInfo : 1;
unsigned m_needsToUpdateAncestorDependentProperties : 1;
unsigned m_childNeedsToUpdateAncestorDependantProperties : 1;
RenderLayerModelObject* m_renderer;
RenderLayer* m_parent;
RenderLayer* m_previous;
RenderLayer* m_next;
RenderLayer* m_first;
RenderLayer* m_last;
LayoutSize m_offsetForInFlowPosition;
LayoutPoint m_topLeft;
IntSize m_layerSize;
LayoutUnit m_staticInlinePosition;
LayoutUnit m_staticBlockPosition;
OwnPtr<TransformationMatrix> m_transform;
RenderLayer* m_enclosingPaginationLayer;
struct CompositingProperties {
CompositingProperties()
: hasCompositingDescendant(false)
, hasNonCompositedChild(false)
, shouldIsolateCompositedDescendants(false)
, lostGroupedMapping(false)
, viewportConstrainedNotCompositedReason(NoNotCompositedReason)
, compositingReasons(CompositingReasonNone)
{ }
bool hasCompositingDescendant : 1;
bool hasNonCompositedChild : 1;
bool shouldIsolateCompositedDescendants : 1;
bool lostGroupedMapping : 1;
unsigned viewportConstrainedNotCompositedReason : ViewportConstrainedNotCompositedReasonBits;
CompositingReasons compositingReasons;
IntSize offsetFromSquashingLayerOrigin;
};
AncestorDependentProperties m_ancestorDependentProperties;
CompositingProperties m_compositingProperties;
IntRect m_blockSelectionGapsBounds;
OwnPtr<CompositedLayerMapping> m_compositedLayerMapping;
OwnPtr<RenderLayerScrollableArea> m_scrollableArea;
mutable OwnPtr<AncestorDependentPropertyCache> m_ancestorDependentPropertyCache;
CompositedLayerMapping* m_groupedMapping;
RenderLayerRepainter m_repainter;
RenderLayerClipper m_clipper;
OwnPtr<RenderLayerStackingNode> m_stackingNode;
OwnPtr<RenderLayerReflectionInfo> m_reflectionInfo;
RenderLayerBlendInfo m_blendInfo;
LayoutSize m_subpixelAccumulation;
};
}
#ifndef NDEBUG
void showLayerTree(const WebCore::RenderLayer*);
void showLayerTree(const WebCore::RenderObject*);
#endif
#endif