summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderLayer.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/rendering/RenderLayer.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/rendering/RenderLayer.h')
-rw-r--r--Source/WebCore/rendering/RenderLayer.h863
1 files changed, 344 insertions, 519 deletions
diff --git a/Source/WebCore/rendering/RenderLayer.h b/Source/WebCore/rendering/RenderLayer.h
index 239214358..1ae683dd0 100644
--- a/Source/WebCore/rendering/RenderLayer.h
+++ b/Source/WebCore/rendering/RenderLayer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003, 2009, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2009, 2012, 2015 Apple Inc. All rights reserved.
*
* Portions are Copyright (C) 1998 Netscape Communications Corporation.
*
@@ -41,18 +41,21 @@
* version of this file under any of the LGPL, the MPL or the GPL.
*/
-#ifndef RenderLayer_h
-#define RenderLayer_h
+#pragma once
+#include "ClipRect.h"
#include "GraphicsLayer.h"
+#include "LayerFragment.h"
#include "PaintInfo.h"
#include "RenderBox.h"
#include "RenderPtr.h"
#include "ScrollableArea.h"
-#include <wtf/OwnPtr.h>
+#include <memory>
namespace WebCore {
+class ClipRects;
+class ClipRectsCache;
class FilterEffectRenderer;
class FilterEffectRendererHelper;
class FilterOperations;
@@ -81,147 +84,6 @@ enum RepaintStatus {
NeedsFullRepaintForPositionedMovementLayout
};
-class ClipRect {
-public:
- ClipRect()
- : m_hasRadius(false)
- { }
-
- ClipRect(const LayoutRect& rect)
- : m_rect(rect)
- , m_hasRadius(false)
- { }
-
- const LayoutRect& rect() const { return m_rect; }
- void setRect(const LayoutRect& rect) { m_rect = rect; }
-
- bool hasRadius() const { return m_hasRadius; }
- void setHasRadius(bool hasRadius) { m_hasRadius = hasRadius; }
-
- bool operator==(const ClipRect& other) const { return rect() == other.rect() && hasRadius() == other.hasRadius(); }
- bool operator!=(const ClipRect& other) const { return rect() != other.rect() || hasRadius() != other.hasRadius(); }
- bool operator!=(const LayoutRect& otherRect) const { return rect() != otherRect; }
-
- void intersect(const LayoutRect& other) { m_rect.intersect(other); }
- void intersect(const ClipRect& other)
- {
- m_rect.intersect(other.rect());
- if (other.hasRadius())
- m_hasRadius = true;
- }
- void move(LayoutUnit x, LayoutUnit y) { m_rect.move(x, y); }
- void move(const LayoutSize& size) { m_rect.move(size); }
- void moveBy(const LayoutPoint& point) { m_rect.moveBy(point); }
-
- bool isEmpty() const { return m_rect.isEmpty(); }
- bool intersects(const LayoutRect& rect) const { return m_rect.intersects(rect); }
- bool intersects(const HitTestLocation&) const;
-
- void inflateX(LayoutUnit dx) { m_rect.inflateX(dx); }
- void inflateY(LayoutUnit dy) { m_rect.inflateY(dy); }
- void inflate(LayoutUnit d) { inflateX(d); inflateY(d); }
-
-private:
- LayoutRect m_rect;
- bool m_hasRadius;
-};
-
-inline ClipRect intersection(const ClipRect& a, const ClipRect& b)
-{
- ClipRect c = a;
- c.intersect(b);
- return c;
-}
-
-class ClipRects {
- WTF_MAKE_FAST_ALLOCATED;
-public:
- static PassRefPtr<ClipRects> create()
- {
- return adoptRef(new ClipRects);
- }
-
- static PassRefPtr<ClipRects> create(const ClipRects& other)
- {
- return adoptRef(new ClipRects(other));
- }
-
- ClipRects()
- : m_refCnt(1)
- , m_fixed(false)
- {
- }
-
- void reset(const LayoutRect& r)
- {
- m_overflowClipRect = r;
- m_fixedClipRect = r;
- m_posClipRect = r;
- m_fixed = false;
- }
-
- const ClipRect& overflowClipRect() const { return m_overflowClipRect; }
- void setOverflowClipRect(const ClipRect& r) { m_overflowClipRect = r; }
-
- const ClipRect& fixedClipRect() const { return m_fixedClipRect; }
- void setFixedClipRect(const ClipRect&r) { m_fixedClipRect = r; }
-
- const ClipRect& posClipRect() const { return m_posClipRect; }
- void setPosClipRect(const ClipRect& r) { m_posClipRect = r; }
-
- bool fixed() const { return m_fixed; }
- void setFixed(bool fixed) { m_fixed = fixed; }
-
- void ref() { m_refCnt++; }
- void deref()
- {
- if (!--m_refCnt)
- delete this;
- }
-
- bool operator==(const ClipRects& other) const
- {
- return m_overflowClipRect == other.overflowClipRect() &&
- m_fixedClipRect == other.fixedClipRect() &&
- m_posClipRect == other.posClipRect() &&
- m_fixed == other.fixed();
- }
-
- ClipRects& operator=(const ClipRects& other)
- {
- m_overflowClipRect = other.overflowClipRect();
- m_fixedClipRect = other.fixedClipRect();
- m_posClipRect = other.posClipRect();
- m_fixed = other.fixed();
- return *this;
- }
-
-private:
- ClipRects(const LayoutRect& r)
- : m_overflowClipRect(r)
- , m_fixedClipRect(r)
- , m_posClipRect(r)
- , m_refCnt(1)
- , m_fixed(false)
- {
- }
-
- ClipRects(const ClipRects& other)
- : m_overflowClipRect(other.overflowClipRect())
- , m_fixedClipRect(other.fixedClipRect())
- , m_posClipRect(other.posClipRect())
- , m_refCnt(1)
- , m_fixed(other.fixed())
- {
- }
-
- ClipRect m_overflowClipRect;
- ClipRect m_fixedClipRect;
- ClipRect m_posClipRect;
- unsigned m_refCnt : 31;
- bool m_fixed : 1;
-};
-
enum ClipRectsType {
PaintingClipRects, // Relative to painting ancestor. Used for painting.
RootRelativeClipRects, // Relative to the ancestor treated as the root (e.g. transformed layer). Used for hit testing.
@@ -236,86 +98,19 @@ enum ShouldRespectOverflowClip {
RespectOverflowClip
};
-struct ClipRectsCache {
- WTF_MAKE_FAST_ALLOCATED;
-public:
- ClipRectsCache()
- {
-#ifndef NDEBUG
- for (int i = 0; i < NumCachedClipRectsTypes; ++i) {
- m_clipRectsRoot[i] = 0;
- m_scrollbarRelevancy[i] = IgnoreOverlayScrollbarSize;
- }
-#endif
- }
-
- PassRefPtr<ClipRects> getClipRects(ClipRectsType clipRectsType, ShouldRespectOverflowClip respectOverflow) { return m_clipRects[getIndex(clipRectsType, respectOverflow)]; }
- void setClipRects(ClipRectsType clipRectsType, ShouldRespectOverflowClip respectOverflow, PassRefPtr<ClipRects> clipRects) { m_clipRects[getIndex(clipRectsType, respectOverflow)] = clipRects; }
-
-#ifndef NDEBUG
- const RenderLayer* m_clipRectsRoot[NumCachedClipRectsTypes];
- OverlayScrollbarSizeRelevancy m_scrollbarRelevancy[NumCachedClipRectsTypes];
-#endif
-
-private:
- int getIndex(ClipRectsType clipRectsType, ShouldRespectOverflowClip respectOverflow)
- {
- int index = static_cast<int>(clipRectsType);
- if (respectOverflow == RespectOverflowClip)
- index += static_cast<int>(NumCachedClipRectsTypes);
- return index;
- }
-
- RefPtr<ClipRects> m_clipRects[NumCachedClipRectsTypes * 2];
+enum ShouldApplyRootOffsetToFragments {
+ ApplyRootOffsetToFragments,
+ IgnoreRootOffsetForFragments
};
-struct LayerFragment {
-public:
- LayerFragment()
- : shouldPaintContent(false)
- { }
-
- void setRects(const LayoutRect& bounds, const ClipRect& background, const ClipRect& foreground, const ClipRect& outline)
- {
- layerBounds = bounds;
- backgroundRect = background;
- foregroundRect = foreground;
- outlineRect = outline;
- }
-
- void moveBy(const LayoutPoint& offset)
- {
- layerBounds.moveBy(offset);
- backgroundRect.moveBy(offset);
- foregroundRect.moveBy(offset);
- outlineRect.moveBy(offset);
- paginationClip.moveBy(offset);
- }
-
- void intersect(const LayoutRect& rect)
- {
- backgroundRect.intersect(rect);
- foregroundRect.intersect(rect);
- outlineRect.intersect(rect);
- }
-
- bool shouldPaintContent;
- LayoutRect layerBounds;
- ClipRect backgroundRect;
- ClipRect foregroundRect;
- ClipRect outlineRect;
-
- // Unique to paginated fragments. The physical translation to apply to shift the layer when painting/hit-testing.
- LayoutPoint paginationOffset;
-
- // Also unique to paginated fragments. An additional clip that applies to the layer. It is in layer-local
- // (physical) coordinates.
- LayoutRect paginationClip;
+enum LayerScrollCoordinationRole {
+ ViewportConstrained = 1 << 0,
+ Scrolling = 1 << 1
};
-
-typedef Vector<LayerFragment, 1> LayerFragments;
+typedef unsigned LayerScrollCoordinationRoles;
class RenderLayer final : public ScrollableArea {
+ WTF_MAKE_FAST_ALLOCATED;
public:
friend class RenderReplica;
@@ -329,22 +124,23 @@ public:
String name() const;
RenderLayerModelObject& renderer() const { return m_renderer; }
- RenderBox* renderBox() const { return renderer().isBox() ? &toRenderBox(renderer()) : 0; }
+ RenderBox* renderBox() const { return is<RenderBox>(renderer()) ? &downcast<RenderBox>(renderer()) : nullptr; }
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; }
- void addChild(RenderLayer* newChild, RenderLayer* beforeChild = 0);
+ void addChild(RenderLayer* newChild, RenderLayer* beforeChild = nullptr);
RenderLayer* removeChild(RenderLayer*);
+ Page& page() const { return renderer().page(); }
+
void removeOnlyThisLayer();
void insertOnlyThisLayer();
void repaintIncludingDescendants();
-#if USE(ACCELERATED_COMPOSITING)
// Indicate that the layer contents need to be repainted. Only has an effect
// if layer compositing is being used.
void setBackingNeedsRepaint(GraphicsLayer::ShouldClipToLayer = GraphicsLayer::ClipToLayer);
@@ -352,7 +148,6 @@ public:
// The rect is in the coordinate space of the layer's render object.
void setBackingNeedsRepaintInRect(const LayoutRect&, GraphicsLayer::ShouldClipToLayer = GraphicsLayer::ClipToLayer);
void repaintIncludingNonCompositingDescendants(RenderLayerModelObject* repaintContainer);
-#endif
void styleChanged(StyleDifference, const RenderStyle* oldStyle);
@@ -363,9 +158,7 @@ public:
bool cannotBlitToWindow() const;
- bool isTransparent() const;
- RenderLayer* transparentPaintingAncestor();
- void beginTransparencyLayers(GraphicsContext*, const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, PaintBehavior);
+ bool isTransparent() const { return renderer().isTransparent() || renderer().hasMask(); }
bool hasReflection() const { return renderer().hasReflection(); }
bool isReflection() const { return renderer().isReplica(); }
@@ -399,54 +192,70 @@ public:
};
// Scrolling methods for layers that can scroll their overflow.
- void scrollByRecursively(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped, ScrollableArea** scrolledArea = 0);
- void scrollToOffset(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped);
- void scrollToXOffset(int x, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(IntSize(x, scrollYOffset()), clamp); }
- void scrollToYOffset(int y, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(IntSize(scrollXOffset(), y), clamp); }
+ void scrollByRecursively(const IntSize& delta, ScrollOffsetClamping = ScrollOffsetUnclamped, ScrollableArea** scrolledArea = nullptr);
+
+ WEBCORE_EXPORT void scrollToOffset(const ScrollOffset&, ScrollOffsetClamping = ScrollOffsetUnclamped);
+ void scrollToXOffset(int x, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(ScrollOffset(x, scrollOffset().y()), clamp); }
+ void scrollToYOffset(int y, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(ScrollOffset(scrollOffset().x(), y), clamp); }
- int scrollXOffset() const { return m_scrollOffset.width() + scrollOrigin().x(); }
- int scrollYOffset() const { return m_scrollOffset.height() + scrollOrigin().y(); }
- IntSize scrollOffset() const { return IntSize(scrollXOffset(), scrollYOffset()); }
+ void scrollToXPosition(int x, ScrollOffsetClamping = ScrollOffsetUnclamped);
+ void scrollToYPosition(int y, ScrollOffsetClamping = ScrollOffsetUnclamped);
- void scrollRectToVisible(const LayoutRect&, const ScrollAlignment& alignX, const ScrollAlignment& alignY);
+ ScrollOffset scrollOffset() const { return scrollOffsetFromPosition(m_scrollPosition); }
+ IntSize scrollableContentsSize() const;
- LayoutRect getRectToExpose(const LayoutRect& visibleRect, const LayoutRect& visibleRectRelativeToDocument, const LayoutRect& exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& alignY);
+ void availableContentSizeChanged(AvailableSizeChangeReason) override;
+
+ // "absoluteRect" is in scaled document coordinates.
+ void scrollRectToVisible(SelectionRevealMode, const LayoutRect& absoluteRect, bool insideFixed, const ScrollAlignment& alignX, const ScrollAlignment& alignY);
bool scrollsOverflow() const;
bool hasScrollbars() const { return m_hBar || m_vBar; }
void setHasHorizontalScrollbar(bool);
void setHasVerticalScrollbar(bool);
- PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation);
+ Ref<Scrollbar> createScrollbar(ScrollbarOrientation);
void destroyScrollbar(ScrollbarOrientation);
bool hasHorizontalScrollbar() const { return horizontalScrollbar(); }
bool hasVerticalScrollbar() const { return verticalScrollbar(); }
// ScrollableArea overrides
- virtual Scrollbar* horizontalScrollbar() const override { return m_hBar.get(); }
- virtual Scrollbar* verticalScrollbar() const override { return m_vBar.get(); }
- virtual ScrollableArea* enclosingScrollableArea() const override;
+ ScrollPosition scrollPosition() const override { return m_scrollPosition; }
+
+ Scrollbar* horizontalScrollbar() const override { return m_hBar.get(); }
+ Scrollbar* verticalScrollbar() const override { return m_vBar.get(); }
+ ScrollableArea* enclosingScrollableArea() const override;
+ bool isScrollableOrRubberbandable() override;
+ bool hasScrollableOrRubberbandableAncestor() override;
+#if ENABLE(CSS_SCROLL_SNAP)
+ void updateSnapOffsets() override;
+#endif
#if PLATFORM(IOS)
#if ENABLE(TOUCH_EVENTS)
- virtual bool handleTouchEvent(const PlatformTouchEvent&) override;
- virtual bool isTouchScrollable() const override { return true; }
+ bool handleTouchEvent(const PlatformTouchEvent&) override;
+ bool isTouchScrollable() const override { return true; }
#endif
- virtual bool isOverflowScroll() const override { return true; }
+ bool isOverflowScroll() const override { return true; }
- virtual void didStartScroll() override;
- virtual void didEndScroll() override;
- virtual void didUpdateScroll() override;
- virtual void setIsUserScroll(bool isUserScroll) override { m_inUserScroll = isUserScroll; }
+ void didStartScroll() override;
+ void didEndScroll() override;
+ void didUpdateScroll() override;
+ void setIsUserScroll(bool isUserScroll) override { m_inUserScroll = isUserScroll; }
bool isInUserScroll() const { return m_inUserScroll; }
bool requiresScrollBoundsOriginUpdate() const { return m_requiresScrollBoundsOriginUpdate; }
void setRequiresScrollBoundsOriginUpdate(bool requiresUpdate = true) { m_requiresScrollBoundsOriginUpdate = requiresUpdate; }
+ // Returns true when the layer could do touch scrolling, but doesn't look at whether there is actually scrollable overflow.
bool hasAcceleratedTouchScrolling() const;
-
+ // Returns true when there is actually scrollable overflow (requires layout to be up-to-date).
+ bool hasTouchScrollableOverflow() const;
+#else
+ bool hasAcceleratedTouchScrolling() const { return false; }
+ bool hasTouchScrollableOverflow() const { return false; }
#endif
int verticalScrollbarWidth(OverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize) const;
@@ -457,9 +266,9 @@ public:
bool hitTestOverflowControls(HitTestResult&, const IntPoint& localPoint);
IntSize offsetFromResizeCorner(const IntPoint& absolutePoint) const;
- void paintOverflowControls(GraphicsContext*, const IntPoint&, const IntRect& damageRect, bool paintingOverlayControls = false);
- void paintScrollCorner(GraphicsContext*, const IntPoint&, const IntRect& damageRect);
- void paintResizer(GraphicsContext*, const LayoutPoint&, const LayoutRect& damageRect);
+ void paintOverflowControls(GraphicsContext&, const IntPoint&, const IntRect& damageRect, bool paintingOverlayControls = false);
+ void paintScrollCorner(GraphicsContext&, const IntPoint&, const IntRect& damageRect);
+ void paintResizer(GraphicsContext&, const LayoutPoint&, const LayoutRect& damageRect);
void updateScrollInfoAfterLayout();
@@ -473,13 +282,11 @@ public:
bool isRootLayer() const { return m_isRootLayer; }
-#if USE(ACCELERATED_COMPOSITING)
RenderLayerCompositor& compositor() const;
// Notification from the renderer that its content changed (e.g. current frame of image changed).
// Allows updates of layer content without repainting.
void contentChanged(ContentChangeType);
-#endif
bool canRender3DTransforms() const;
@@ -488,7 +295,9 @@ public:
NeedsFullRepaintInBacking = 1 << 1,
IsCompositingUpdateRoot = 1 << 2,
UpdateCompositingLayers = 1 << 3,
- UpdatePagination = 1 << 4
+ UpdatePagination = 1 << 4,
+ SeenTransformedLayer = 1 << 5,
+ Seen3DTransformedLayer = 1 << 6
};
typedef unsigned UpdateLayerPositionsFlags;
static const UpdateLayerPositionsFlags defaultFlags = CheckForRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers;
@@ -498,12 +307,16 @@ public:
void updateLayerPositionsAfterOverflowScroll();
void updateLayerPositionsAfterDocumentScroll();
-#if USE(ACCELERATED_COMPOSITING)
void positionNewlyCreatedOverflowControls();
-#endif
-
- bool isPaginated() const { return m_isPaginated; }
- RenderLayer* enclosingPaginationLayer() const { return m_enclosingPaginationLayer; }
+
+ bool hasCompositedLayerInEnclosingPaginationChain() const;
+ enum PaginationInclusionMode { ExcludeCompositedPaginatedLayers, IncludeCompositedPaginatedLayers };
+ RenderLayer* enclosingPaginationLayer(PaginationInclusionMode mode) const
+ {
+ if (mode == ExcludeCompositedPaginatedLayers && hasCompositedLayerInEnclosingPaginationChain())
+ return nullptr;
+ return m_enclosingPaginationLayer;
+ }
void updateTransform();
@@ -573,7 +386,7 @@ public:
void setHasVisibleContent();
void dirtyVisibleContentStatus();
- bool hasBoxDecorationsOrBackground() const;
+ bool hasVisibleBoxDecorationsOrBackground() const;
bool hasVisibleBoxDecorations() const;
// Returns true if this layer has visible content (ignoring any child layers).
bool isVisuallyNonEmpty() const;
@@ -594,7 +407,7 @@ public:
// Gets the nearest enclosing positioned ancestor layer (also includes
// the <html> layer and the root layer).
- RenderLayer* enclosingPositionedAncestor() const;
+ RenderLayer* enclosingAncestorForPosition(EPosition) const;
// Returns the nearest enclosing layer that is scrollable.
RenderLayer* enclosingScrollableLayer() const;
@@ -604,80 +417,73 @@ public:
RenderLayer* enclosingOverflowClipLayer(IncludeSelfOrNot) const;
-#if USE(ACCELERATED_COMPOSITING)
// Enclosing compositing layer; if includeSelf is true, may return this.
RenderLayer* enclosingCompositingLayer(IncludeSelfOrNot = IncludeSelf) const;
RenderLayer* enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const;
// Ancestor compositing layer, excluding this.
RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(ExcludeSelf); }
-#endif
-#if ENABLE(CSS_FILTERS)
RenderLayer* enclosingFilterLayer(IncludeSelfOrNot = IncludeSelf) const;
RenderLayer* enclosingFilterRepaintLayer() const;
- void setFilterBackendNeedsRepaintingInRect(const LayoutRect&, bool immediate);
+ void setFilterBackendNeedsRepaintingInRect(const LayoutRect&);
bool hasAncestorWithFilterOutsets() const;
-#endif
bool canUseConvertToLayerCoords() const
{
// These RenderObject have an impact on their layers' without them knowing about it.
- return !renderer().hasColumns() && !renderer().hasTransform()
-#if ENABLE(SVG)
- && !renderer().isSVGRoot()
-#endif
- ;
+ return !renderer().hasTransform() && !renderer().isSVGRoot();
}
// FIXME: adjustForColumns allows us to position compositing layers in columns correctly, but eventually they need to be split across columns too.
enum ColumnOffsetAdjustment { DontAdjustForColumns, AdjustForColumns };
void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntPoint& location, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const;
- void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntRect&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const;
- void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutPoint&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const;
- void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutRect&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const;
+ LayoutPoint convertToLayerCoords(const RenderLayer* ancestorLayer, const LayoutPoint&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const;
+ LayoutSize offsetFromAncestor(const RenderLayer*, ColumnOffsetAdjustment = DontAdjustForColumns) const;
int zIndex() const { return renderer().style().zIndex(); }
enum PaintLayerFlag {
- PaintLayerHaveTransparency = 1,
- PaintLayerAppliedTransform = 1 << 1,
- PaintLayerTemporaryClipRects = 1 << 2,
- PaintLayerPaintingReflection = 1 << 3,
- PaintLayerPaintingOverlayScrollbars = 1 << 4,
- PaintLayerPaintingCompositingBackgroundPhase = 1 << 5,
- PaintLayerPaintingCompositingForegroundPhase = 1 << 6,
- PaintLayerPaintingCompositingMaskPhase = 1 << 7,
- PaintLayerPaintingCompositingScrollingPhase = 1 << 8,
- PaintLayerPaintingOverflowContents = 1 << 9,
- PaintLayerPaintingRootBackgroundOnly = 1 << 10,
- PaintLayerPaintingSkipRootBackground = 1 << 11,
- PaintLayerPaintingCompositingAllPhases = (PaintLayerPaintingCompositingBackgroundPhase | PaintLayerPaintingCompositingForegroundPhase | PaintLayerPaintingCompositingMaskPhase)
+ PaintLayerHaveTransparency = 1 << 0,
+ PaintLayerAppliedTransform = 1 << 1,
+ PaintLayerTemporaryClipRects = 1 << 2,
+ PaintLayerPaintingReflection = 1 << 3,
+ PaintLayerPaintingOverlayScrollbars = 1 << 4,
+ PaintLayerPaintingCompositingBackgroundPhase = 1 << 5,
+ PaintLayerPaintingCompositingForegroundPhase = 1 << 6,
+ PaintLayerPaintingCompositingMaskPhase = 1 << 7,
+ PaintLayerPaintingCompositingClipPathPhase = 1 << 8,
+ PaintLayerPaintingCompositingScrollingPhase = 1 << 9,
+ PaintLayerPaintingOverflowContents = 1 << 10,
+ PaintLayerPaintingRootBackgroundOnly = 1 << 11,
+ PaintLayerPaintingSkipRootBackground = 1 << 12,
+ PaintLayerPaintingChildClippingMaskPhase = 1 << 13,
+ PaintLayerPaintingCompositingAllPhases = PaintLayerPaintingCompositingBackgroundPhase | PaintLayerPaintingCompositingForegroundPhase
};
typedef unsigned PaintLayerFlags;
+ enum class SecurityOriginPaintPolicy { AnyOrigin, AccessibleOriginOnly };
+
// The two main functions that use the layer system. The paint method
// paints the layers that intersect the damage rect from back to
// front. The hitTest method looks for mouse events by walking
// layers that intersect the point from front to back.
- void paint(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior = PaintBehaviorNormal, RenderObject* subtreePaintRoot = 0,
- RenderRegion* = 0, PaintLayerFlags = 0);
+ void paint(GraphicsContext&, const LayoutRect& damageRect, const LayoutSize& subpixelOffset = LayoutSize(), PaintBehavior = PaintBehaviorNormal,
+ RenderObject* subtreePaintRoot = nullptr, PaintLayerFlags = 0, SecurityOriginPaintPolicy = SecurityOriginPaintPolicy::AnyOrigin);
bool hitTest(const HitTestRequest&, HitTestResult&);
bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&);
- void paintOverlayScrollbars(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior, RenderObject* subtreePaintRoot = 0);
+ void paintOverlayScrollbars(GraphicsContext&, const LayoutRect& damageRect, PaintBehavior, RenderObject* subtreePaintRoot = nullptr);
- void paintNamedFlowThreadInsideRegion(GraphicsContext*, RenderNamedFlowFragment*, LayoutRect, LayoutPoint, PaintBehavior = PaintBehaviorNormal, PaintLayerFlags = 0);
+ void paintNamedFlowThreadInsideRegion(GraphicsContext&, RenderNamedFlowFragment*, LayoutRect, LayoutPoint, PaintBehavior = PaintBehaviorNormal, PaintLayerFlags = 0);
struct ClipRectsContext {
- ClipRectsContext(const RenderLayer* inRootLayer, RenderRegion* inRegion, ClipRectsType inClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize, ShouldRespectOverflowClip inRespectOverflowClip = RespectOverflowClip)
+ ClipRectsContext(const RenderLayer* inRootLayer, ClipRectsType inClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize, ShouldRespectOverflowClip inRespectOverflowClip = RespectOverflowClip)
: rootLayer(inRootLayer)
- , region(inRegion)
, clipRectsType(inClipRectsType)
, overlayScrollbarSizeRelevancy(inOverlayScrollbarSizeRelevancy)
, respectOverflowClip(inRespectOverflowClip)
{ }
const RenderLayer* rootLayer;
- RenderRegion* region;
ClipRectsType clipRectsType;
OverlayScrollbarSizeRelevancy overlayScrollbarSizeRelevancy;
ShouldRespectOverflowClip respectOverflowClip;
@@ -688,68 +494,58 @@ public:
// for painting/event handling.
// Pass offsetFromRoot if known.
void calculateRects(const ClipRectsContext&, const LayoutRect& paintDirtyRect, LayoutRect& layerBounds,
- ClipRect& backgroundRect, ClipRect& foregroundRect, ClipRect& outlineRect, const LayoutPoint* offsetFromRoot = 0) const;
-
- // Compute and cache clip rects computed with the given layer as the root
- void updateClipRects(const ClipRectsContext&);
- // Compute and return the clip rects. If useCached is true, will used previously computed clip rects on ancestors
- // (rather than computing them all from scratch up the parent chain).
- void calculateClipRects(const ClipRectsContext&, ClipRects&) const;
-
- ClipRects* clipRects(const ClipRectsContext& context) const
- {
- ASSERT(context.clipRectsType < NumCachedClipRectsTypes);
- return m_clipRectsCache ? m_clipRectsCache->getClipRects(context.clipRectsType, context.respectOverflowClip).get() : 0;
- }
+ ClipRect& backgroundRect, ClipRect& foregroundRect, const LayoutSize& offsetFromRoot) const;
LayoutRect childrenClipRect() const; // Returns the foreground clip rect of the layer in the document's coordinate space.
LayoutRect selfClipRect() const; // Returns the background clip rect of the layer in the document's coordinate space.
- LayoutRect localClipRect() const; // Returns the background clip rect of the layer in the local coordinate space.
+ LayoutRect localClipRect(bool& clipExceedsBounds) const; // Returns the background clip rect of the layer in the local coordinate space.
// Pass offsetFromRoot if known.
- bool intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot = 0, RenderRegion* = 0) const;
+ bool intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutSize& offsetFromRoot, const LayoutRect* cachedBoundingBox = nullptr) const;
enum CalculateLayerBoundsFlag {
- IncludeSelfTransform = 1 << 0,
- UseLocalClipRectIfPossible = 1 << 1,
- IncludeLayerFilterOutsets = 1 << 2,
- ExcludeHiddenDescendants = 1 << 3,
- DontConstrainForMask = 1 << 4,
- IncludeCompositedDescendants = 1 << 5,
- UseFragmentBoxes = 1 << 6,
- DefaultCalculateLayerBoundsFlags = IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets | UseFragmentBoxes
+ IncludeSelfTransform = 1 << 0,
+ UseLocalClipRectIfPossible = 1 << 1,
+ IncludeLayerFilterOutsets = 1 << 2,
+ ExcludeHiddenDescendants = 1 << 3,
+ DontConstrainForMask = 1 << 4,
+ IncludeCompositedDescendants = 1 << 5,
+ UseFragmentBoxesExcludingCompositing = 1 << 6,
+ UseFragmentBoxesIncludingCompositing = 1 << 7,
+ DefaultCalculateLayerBoundsFlags = IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets | UseFragmentBoxesExcludingCompositing
};
typedef unsigned CalculateLayerBoundsFlags;
// Bounding box relative to some ancestor layer. Pass offsetFromRoot if known.
- LayoutRect boundingBox(const RenderLayer* rootLayer, CalculateLayerBoundsFlags = 0, const LayoutPoint* offsetFromRoot = 0) const;
+ LayoutRect boundingBox(const RenderLayer* rootLayer, const LayoutSize& offsetFromRoot = LayoutSize(), CalculateLayerBoundsFlags = 0) const;
// Bounding box in the coordinates of this layer.
LayoutRect localBoundingBox(CalculateLayerBoundsFlags = 0) const;
- // Pixel snapped bounding box relative to the root.
- IntRect absoluteBoundingBox() const;
+ // Deprecated: Pixel snapped bounding box relative to the root.
+ WEBCORE_EXPORT IntRect absoluteBoundingBox() const;
+ // Device pixel snapped bounding box relative to the root. absoluteBoundingBox() callers will be directed to this.
+ FloatRect absoluteBoundingBoxForPainting() const;
// Bounds used for layer overlap testing in RenderLayerCompositor.
- LayoutRect overlapBounds() const { return overlapBoundsIncludeChildren() ? calculateLayerBounds(this) : localBoundingBox(); }
+ LayoutRect overlapBounds() const { return overlapBoundsIncludeChildren() ? calculateLayerBounds(this, LayoutSize()) : localBoundingBox(); }
+
+ // Takes transform animations into account, returning true if they could be cheaply computed.
+ // Unlike overlapBounds, these bounds include descendant layers.
+ bool getOverlapBoundsIncludingChildrenAccountingForTransformAnimations(LayoutRect&) const;
-#if ENABLE(CSS_FILTERS)
// If true, this layer's children are included in its bounds for overlap testing.
// We can't rely on the children's positions if this layer has a filter that could have moved the children's pixels around.
bool overlapBoundsIncludeChildren() const { return hasFilter() && renderer().style().filter().hasFilterThatMovesPixels(); }
-#else
- bool overlapBoundsIncludeChildren() const { return false; }
-#endif
// Can pass offsetFromRoot if known.
- LayoutRect calculateLayerBounds(const RenderLayer* ancestorLayer, const LayoutPoint* offsetFromRoot = 0, CalculateLayerBoundsFlags = DefaultCalculateLayerBoundsFlags) const;
+ LayoutRect calculateLayerBounds(const RenderLayer* ancestorLayer, const LayoutSize& offsetFromRoot, CalculateLayerBoundsFlags = DefaultCalculateLayerBoundsFlags) const;
- // WARNING: This method returns the offset for the parent as this is what updateLayerPositions expects.
- LayoutPoint computeOffsetFromRoot(bool& hasLayerOffset) const;
-
// Return a cached repaint rect, computed relative to the layer renderer's containerForRepaint.
- LayoutRect repaintRect() const { return m_repaintRect; }
+ bool hasComputedRepaintRect() const { return m_hasComputedRepaintRect; }
+ LayoutRect repaintRect() const { ASSERT(hasComputedRepaintRect()); return m_repaintRect; }
LayoutRect repaintRectIncludingNonCompositingDescendants() const;
void setRepaintStatus(RepaintStatus status) { m_repaintStatus = status; }
+ RepaintStatus repaintStatus() const { return static_cast<RepaintStatus>(m_repaintStatus); }
LayoutUnit staticInlinePosition() const { return m_staticInlinePosition; }
LayoutUnit staticBlockPosition() const { return m_staticBlockPosition; }
@@ -779,47 +575,62 @@ public:
bool preserves3D() const { return renderer().style().transformStyle3D() == TransformStyle3DPreserve3D; }
bool has3DTransform() const { return m_transform && !m_transform->isAffine(); }
-#if ENABLE(CSS_FILTERS)
- virtual void filterNeedsRepaint();
+ void filterNeedsRepaint();
bool hasFilter() const { return renderer().hasFilter(); }
+ bool hasBackdropFilter() const
+ {
+#if ENABLE(FILTERS_LEVEL_2)
+ return renderer().hasBackdropFilter();
#else
- bool hasFilter() const { return false; }
+ return false;
#endif
+ }
#if ENABLE(CSS_COMPOSITING)
bool hasBlendMode() const { return renderer().hasBlendMode(); }
+ BlendMode blendMode() const { return static_cast<BlendMode>(m_blendMode); }
+
+ bool isolatesCompositedBlending() const { return m_hasNotIsolatedCompositedBlendingDescendants && isStackingContext(); }
+ bool hasNotIsolatedCompositedBlendingDescendants() const { return m_hasNotIsolatedCompositedBlendingDescendants; }
+ void setHasNotIsolatedCompositedBlendingDescendants(bool hasNotIsolatedCompositedBlendingDescendants)
+ {
+ m_hasNotIsolatedCompositedBlendingDescendants = hasNotIsolatedCompositedBlendingDescendants;
+ }
+
+ bool isolatesBlending() const { return hasNotIsolatedBlendingDescendants() && isStackingContext(); }
+
+ // FIXME: We should ASSERT(!m_hasNotIsolatedBlendingDescendantsStatusDirty); here but we hit the same bugs as visible content above.
+ bool hasNotIsolatedBlendingDescendants() const { return m_hasNotIsolatedBlendingDescendants; }
+ bool hasNotIsolatedBlendingDescendantsStatusDirty() const { return m_hasNotIsolatedBlendingDescendantsStatusDirty; }
#else
bool hasBlendMode() const { return false; }
+ bool isolatesCompositedBlending() const { return false; }
+ bool isolatesBlending() const { return false; }
+ bool hasNotIsolatedBlendingDescendantsStatusDirty() const { return false; }
#endif
-#if USE(ACCELERATED_COMPOSITING)
bool isComposited() const { return m_backing != 0; }
bool hasCompositingDescendant() const { return m_hasCompositingDescendant; }
bool hasCompositedMask() const;
RenderLayerBacking* backing() const { return m_backing.get(); }
RenderLayerBacking* ensureBacking();
void clearBacking(bool layerBeingDestroyed = false);
- virtual GraphicsLayer* layerForScrolling() const override;
- virtual GraphicsLayer* layerForHorizontalScrollbar() const override;
- virtual GraphicsLayer* layerForVerticalScrollbar() const override;
- virtual GraphicsLayer* layerForScrollCorner() const override;
- virtual bool usesCompositedScrolling() const override;
- bool needsCompositedScrolling() const;
- bool needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const;
- bool needsCompositingLayersRebuiltForOverflow(const RenderStyle* oldStyle, const RenderStyle* newStyle) const;
-#else
- bool isComposited() const { return false; }
- bool hasCompositedMask() const { return false; }
- bool usesCompositedScrolling() const { return false; }
- bool needsCompositedScrolling() const { return false; }
-#endif
+ GraphicsLayer* layerForScrolling() const override;
+ GraphicsLayer* layerForHorizontalScrollbar() const override;
+ GraphicsLayer* layerForVerticalScrollbar() const override;
+ GraphicsLayer* layerForScrollCorner() const override;
+ bool usesCompositedScrolling() const override;
+ bool usesAsyncScrolling() const override;
+ WEBCORE_EXPORT bool needsCompositedScrolling() const;
bool paintsWithTransparency(PaintBehavior paintBehavior) const
{
- return isTransparent() && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || !isComposited());
+ return (isTransparent() || hasBlendMode() || (isolatesBlending() && !renderer().isDocumentElementRenderer())) && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || !isComposited());
}
bool paintsWithTransform(PaintBehavior) const;
+ bool shouldPaintMask(PaintBehavior, PaintLayerFlags) const;
+ bool shouldApplyClipPath(PaintBehavior, PaintLayerFlags) const;
// Returns true if background phase is painted opaque in the given rect.
// The query rect is given in local coordinates.
@@ -828,11 +639,9 @@ public:
bool containsDirtyOverlayScrollbars() const { return m_containsDirtyOverlayScrollbars; }
void setContainsDirtyOverlayScrollbars(bool dirtyScrollbars) { m_containsDirtyOverlayScrollbars = dirtyScrollbars; }
-#if ENABLE(CSS_FILTERS)
bool paintsWithFilters() const;
bool requiresFullLayerImageForFilters() const;
FilterEffectRenderer* filterRenderer() const;
-#endif
#if !ASSERT_DISABLED
bool layerListMutationAllowed() const { return m_layerListMutationAllowed; }
@@ -841,7 +650,6 @@ public:
Element* enclosingElement() const;
-#if USE(ACCELERATED_COMPOSITING)
enum ViewportConstrainedNotCompositedReason {
NoNotCompositedReason,
NotCompositedForBoundsOutOfView,
@@ -851,7 +659,6 @@ public:
void setViewportConstrainedNotCompositedReason(ViewportConstrainedNotCompositedReason reason) { m_viewportConstrainedNotCompositedReason = reason; }
ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason() const { return static_cast<ViewportConstrainedNotCompositedReason>(m_viewportConstrainedNotCompositedReason); }
-#endif
bool isRenderFlowThread() const { return renderer().isRenderFlowThread(); }
bool isOutOfFlowRenderFlowThread() const { return renderer().isOutOfFlowRenderFlowThread(); }
@@ -867,19 +674,48 @@ public:
RenderLayer* enclosingFlowThreadAncestor() const;
+ bool shouldPlaceBlockDirectionScrollbarOnLeft() const final { return renderer().shouldPlaceBlockDirectionScrollbarOnLeft(); }
+
private:
enum CollectLayersBehavior { StopAtStackingContexts, StopAtStackingContainers };
+ struct LayerPaintingInfo {
+ LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect& inDirtyRect, PaintBehavior inPaintBehavior, const LayoutSize& inSupixelOffset, RenderObject* inSubtreePaintRoot = nullptr, OverlapTestRequestMap* inOverlapTestRequests = nullptr, bool inRequireSecurityOriginAccessForWidgets = false)
+ : rootLayer(inRootLayer)
+ , subtreePaintRoot(inSubtreePaintRoot)
+ , paintDirtyRect(inDirtyRect)
+ , subpixelOffset(inSupixelOffset)
+ , overlapTestRequests(inOverlapTestRequests)
+ , paintBehavior(inPaintBehavior)
+ , requireSecurityOriginAccessForWidgets(inRequireSecurityOriginAccessForWidgets)
+ { }
+ RenderLayer* rootLayer;
+ RenderObject* subtreePaintRoot; // only paint descendants of this object
+ LayoutRect paintDirtyRect; // relative to rootLayer;
+ LayoutSize subpixelOffset;
+ OverlapTestRequestMap* overlapTestRequests; // May be null.
+ PaintBehavior paintBehavior;
+ bool requireSecurityOriginAccessForWidgets;
+ bool clipToDirtyRect { true };
+ };
+
+ // Compute, cache and return clip rects computed with the given layer as the root.
+ Ref<ClipRects> updateClipRects(const ClipRectsContext&);
+ // Compute and return the clip rects. If useCached is true, will used previously computed clip rects on ancestors
+ // (rather than computing them all from scratch up the parent chain).
+ void calculateClipRects(const ClipRectsContext&, ClipRects&) const;
+ ClipRects* clipRects(const ClipRectsContext&) const;
+
void updateZOrderLists();
void rebuildZOrderLists();
- void rebuildZOrderLists(CollectLayersBehavior, OwnPtr<Vector<RenderLayer*>>&, OwnPtr<Vector<RenderLayer*>>&);
+ void rebuildZOrderLists(CollectLayersBehavior, std::unique_ptr<Vector<RenderLayer*>>&, std::unique_ptr<Vector<RenderLayer*>>&);
void clearZOrderLists();
void updateNormalFlowList();
// Non-auto z-index always implies stacking context here, because StyleResolver::adjustRenderStyle already adjusts z-index
// based on positioning and other criteria.
- bool isStackingContext(const RenderStyle* style) const { return !style->hasAutoZIndex() || isRootLayer(); }
+ bool isStackingContext(const RenderStyle* style) const { return !style->hasAutoZIndex() || isRootLayer() || m_forcedStackingContext; }
bool isDirtyStackingContainer() const { return m_zOrderListsDirty && isStackingContainer(); }
@@ -890,13 +726,14 @@ private:
void updateDescendantsAreContiguousInStackingOrder();
void updateDescendantsAreContiguousInStackingOrderRecursive(const HashMap<const RenderLayer*, int>&, int& minIndex, int& maxIndex, int& count, bool firstIteration);
- void computeRepaintRects(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap* = 0);
+ void computeRepaintRects(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap* = nullptr);
void computeRepaintRectsIncludingDescendants();
void clearRepaintRects();
- void clipToRect(RenderLayer* rootLayer, GraphicsContext*, const LayoutRect& paintDirtyRect, const ClipRect&,
- BorderRadiusClippingRule = IncludeSelfForBorderRadius);
- void restoreClip(GraphicsContext*, const LayoutRect& paintDirtyRect, const ClipRect&);
+ LayoutRect clipRectRelativeToAncestor(RenderLayer* ancestor, LayoutSize offsetFromAncestor, const LayoutRect& constrainingRect) const;
+
+ void clipToRect(GraphicsContext&, const LayerPaintingInfo&, const ClipRect&, BorderRadiusClippingRule = IncludeSelfForBorderRadius);
+ void restoreClip(GraphicsContext&, const LayerPaintingInfo&, const ClipRect&);
bool shouldRepaintAfterLayout() const;
@@ -915,7 +752,7 @@ private:
// Returns true if the position changed.
bool updateLayerPosition();
- void updateLayerPositions(RenderGeometryMap* = 0, UpdateLayerPositionsFlags = defaultFlags);
+ void updateLayerPositions(RenderGeometryMap* = nullptr, UpdateLayerPositionsFlags = defaultFlags);
enum UpdateLayerPositionsAfterScrollFlag {
NoFlag = 0,
@@ -927,10 +764,9 @@ private:
typedef unsigned UpdateLayerPositionsAfterScrollFlags;
void updateLayerPositionsAfterScroll(RenderGeometryMap*, UpdateLayerPositionsAfterScrollFlags = NoFlag);
- friend IntSize RenderBox::scrolledContentOffset() const;
- IntSize scrolledContentOffset() const { return m_scrollOffset; }
+ ScrollOffset clampScrollOffset(const ScrollOffset&) const;
- IntSize clampScrollOffset(const IntSize&) const;
+ RenderLayer* enclosingPaginationLayerInSubtree(const RenderLayer* rootLayer, PaginationInclusionMode) const;
void setNextSibling(RenderLayer* next) { m_next = next; }
void setPreviousSibling(RenderLayer* prev) { m_previous = prev; }
@@ -938,81 +774,61 @@ private:
void setFirstChild(RenderLayer* first) { m_first = first; }
void setLastChild(RenderLayer* last) { m_last = last; }
- LayoutPoint renderBoxLocation() const { return renderer().isBox() ? toRenderBox(renderer()).location() : LayoutPoint(); }
+ LayoutPoint renderBoxLocation() const { return is<RenderBox>(renderer()) ? downcast<RenderBox>(renderer()).location() : LayoutPoint(); }
- void collectLayers(bool includeHiddenLayers, CollectLayersBehavior, OwnPtr<Vector<RenderLayer*>>&, OwnPtr<Vector<RenderLayer*>>&);
+ void collectLayers(bool includeHiddenLayers, CollectLayersBehavior, std::unique_ptr<Vector<RenderLayer*>>&, std::unique_ptr<Vector<RenderLayer*>>&);
void updateCompositingAndLayerListsIfNeeded();
- struct LayerPaintingInfo {
- LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect& inDirtyRect, PaintBehavior inPaintBehavior, const LayoutSize& inSubPixelAccumulation, RenderObject* inSubtreePaintRoot = 0, RenderRegion*inRegion = 0, OverlapTestRequestMap* inOverlapTestRequests = 0)
- : rootLayer(inRootLayer)
- , subtreePaintRoot(inSubtreePaintRoot)
- , paintDirtyRect(inDirtyRect)
- , subPixelAccumulation(inSubPixelAccumulation)
- , region(inRegion)
- , overlapTestRequests(inOverlapTestRequests)
- , paintBehavior(inPaintBehavior)
- , clipToDirtyRect(true)
- { }
- RenderLayer* rootLayer;
- RenderObject* subtreePaintRoot; // only paint descendants of this object
- LayoutRect paintDirtyRect; // relative to rootLayer;
- LayoutSize subPixelAccumulation;
- RenderRegion* region; // May be null.
- OverlapTestRequestMap* overlapTestRequests; // May be null.
- PaintBehavior paintBehavior;
- bool clipToDirtyRect;
- };
+ bool setupFontSubpixelQuantization(GraphicsContext&, bool& didQuantizeFonts);
- bool setupFontSubpixelQuantization(GraphicsContext*, bool& didQuantizeFonts);
- bool setupClipPath(GraphicsContext*, const LayerPaintingInfo&, const LayoutPoint& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed);
-#if ENABLE(CSS_FILTERS)
- PassOwnPtr<FilterEffectRendererHelper> setupFilters(GraphicsContext*, LayerPaintingInfo&, PaintLayerFlags, const LayoutPoint& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed);
- GraphicsContext* applyFilters(FilterEffectRendererHelper*, GraphicsContext* originalContext, LayerPaintingInfo&, LayerFragments&);
-#endif
+ Path computeClipPath(const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, WindRule&) const;
- void paintLayer(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
- void paintFixedLayersInNamedFlows(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
- void paintLayerContentsAndReflection(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
- void paintLayerByApplyingTransform(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const LayoutPoint& translationOffset = LayoutPoint());
- void paintLayerContents(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
- void paintList(Vector<RenderLayer*>*, 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, RenderRegion*, const LayoutRect& dirtyRect,
- ClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize,
- ShouldRespectOverflowClip = RespectOverflowClip, const LayoutPoint* offsetFromRoot = 0, const LayoutRect* layerBoundingBox = 0);
- void updatePaintingInfoForFragments(LayerFragments&, const LayerPaintingInfo&, PaintLayerFlags, bool shouldPaintContent, const LayoutPoint* offsetFromRoot);
- void paintBackgroundForFragments(const LayerFragments&, GraphicsContext*, GraphicsContext* transparencyLayerContext,
+ bool setupClipPath(GraphicsContext&, const LayerPaintingInfo&, const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed);
+
+ class FilterInfo;
+ std::pair<FilterInfo*, std::unique_ptr<FilterEffectRendererHelper>> filterPainter(GraphicsContext&, PaintLayerFlags) const;
+ bool hasFilterThatIsPainting(GraphicsContext&, PaintLayerFlags) const;
+ std::unique_ptr<FilterEffectRendererHelper> setupFilters(GraphicsContext&, LayerPaintingInfo&, PaintLayerFlags, const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed);
+ void applyFilters(FilterEffectRendererHelper*, GraphicsContext& originalContext, const LayerPaintingInfo&, const LayerFragments&);
+
+ void paintLayer(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags);
+ void paintFixedLayersInNamedFlows(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags);
+ void paintLayerContentsAndReflection(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags);
+ void paintLayerByApplyingTransform(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags, const LayoutSize& translationOffset = LayoutSize());
+ void paintLayerContents(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags);
+ void paintList(Vector<RenderLayer*>*, GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags);
+
+ void collectFragments(LayerFragments&, const RenderLayer* rootLayer, const LayoutRect& dirtyRect,
+ PaginationInclusionMode,
+ ClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy, ShouldRespectOverflowClip, const LayoutSize& offsetFromRoot,
+ const LayoutRect* layerBoundingBox = nullptr, ShouldApplyRootOffsetToFragments = IgnoreRootOffsetForFragments);
+ void updatePaintingInfoForFragments(LayerFragments&, const LayerPaintingInfo&, PaintLayerFlags, bool shouldPaintContent, const LayoutSize& 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,
+ 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 paintTransformedLayerIntoFragments(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags);
+ bool selectionOnly);
+ 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* transparentPaintingAncestor();
+ void beginTransparencyLayers(GraphicsContext&, const LayerPaintingInfo&, const LayoutRect& dirtyRect);
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);
+ const LayoutRect& hitTestRect, const HitTestLocation&, bool appliedTransform,
+ const HitTestingTransformState* = nullptr, double* zOffset = nullptr);
RenderLayer* hitTestLayerByApplyingTransform(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest&, HitTestResult&,
- const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = 0, double* zOffset = 0,
- const LayoutPoint& translationOffset = LayoutPoint());
+ const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = nullptr, double* zOffset = nullptr,
+ const LayoutSize& translationOffset = LayoutSize());
RenderLayer* hitTestList(Vector<RenderLayer*>*, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result,
- 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);
+ const LayoutRect& hitTestRect, const HitTestLocation&,
+ const HitTestingTransformState*, double* zOffsetForDescendants, double* zOffset,
+ const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants);
RenderLayer* hitTestFixedLayersInNamedFlows(RenderLayer* rootLayer,
const HitTestRequest&, HitTestResult&,
@@ -1022,16 +838,16 @@ private:
const HitTestingTransformState* unflattenedTransformState,
bool depthSortDescendants);
- PassRefPtr<HitTestingTransformState> createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer,
- const LayoutRect& hitTestRect, const HitTestLocation&,
- const HitTestingTransformState* containerTransformState,
- const LayoutPoint& translationOffset = LayoutPoint()) const;
+ Ref<HitTestingTransformState> createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer,
+ const LayoutRect& hitTestRect, const HitTestLocation&,
+ const HitTestingTransformState* containerTransformState,
+ const LayoutSize& translationOffset = LayoutSize()) 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;
bool hitTestResizerInFragments(const LayerFragments&, const HitTestLocation&) const;
RenderLayer* hitTestTransformedLayerInFragments(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest&, HitTestResult&,
- const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = 0, double* zOffset = 0);
+ const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = nullptr, double* zOffset = nullptr);
bool listBackgroundIsKnownToBeOpaqueInRect(const Vector<RenderLayer*>*, const LayoutRect&) const;
@@ -1041,36 +857,42 @@ private:
bool hasScrollableHorizontalOverflow() const;
bool hasScrollableVerticalOverflow() const;
+ bool showsOverflowControls() const;
+
bool shouldBeNormalFlowOnly() const;
bool shouldBeSelfPaintingLayer() const;
- virtual int scrollPosition(Scrollbar*) const override;
+ int scrollOffset(ScrollbarOrientation) const override;
// ScrollableArea interface
- virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) override;
- virtual void invalidateScrollCornerRect(const IntRect&) override;
- virtual bool isActive() const override;
- virtual bool isScrollCornerVisible() const override;
- virtual IntRect scrollCornerRect() const override;
- virtual IntRect convertFromScrollbarToContainingView(const Scrollbar*, const IntRect&) const override;
- virtual IntRect convertFromContainingViewToScrollbar(const Scrollbar*, const IntRect&) const override;
- virtual IntPoint convertFromScrollbarToContainingView(const Scrollbar*, const IntPoint&) const override;
- virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar*, const IntPoint&) const override;
- virtual int scrollSize(ScrollbarOrientation) const override;
- virtual void setScrollOffset(const IntPoint&) override;
- virtual IntPoint scrollPosition() const override;
- virtual IntPoint minimumScrollPosition() const override;
- virtual IntPoint maximumScrollPosition() const override;
- virtual IntRect visibleContentRectInternal(VisibleContentRectIncludesScrollbars, VisibleContentRectBehavior) const override;
- virtual IntSize visibleSize() const override { return m_layerSize; }
- virtual IntSize contentsSize() const override;
- virtual IntSize overhangAmount() const override;
- virtual IntPoint lastKnownMousePosition() const override;
- virtual bool isHandlingWheelEvent() const override;
- virtual bool shouldSuspendScrollAnimations() const override;
- virtual IntRect scrollableAreaBoundingBox() const override;
- virtual bool updatesScrollLayerPositionOnMainThread() const override { return true; }
+ void invalidateScrollbarRect(Scrollbar&, const IntRect&) override;
+ void invalidateScrollCornerRect(const IntRect&) override;
+ bool isActive() const override;
+ bool isScrollCornerVisible() const override;
+ IntRect scrollCornerRect() const override;
+ IntRect convertFromScrollbarToContainingView(const Scrollbar&, const IntRect&) const override;
+ IntRect convertFromContainingViewToScrollbar(const Scrollbar&, const IntRect&) const override;
+ IntPoint convertFromScrollbarToContainingView(const Scrollbar&, const IntPoint&) const override;
+ IntPoint convertFromContainingViewToScrollbar(const Scrollbar&, const IntPoint&) const override;
+ int scrollSize(ScrollbarOrientation) const override;
+ void setScrollOffset(const ScrollOffset&) override;
+
+ IntRect visibleContentRectInternal(VisibleContentRectIncludesScrollbars, VisibleContentRectBehavior) const override;
+ IntSize visibleSize() const override;
+ IntSize contentsSize() const override;
+ IntSize overhangAmount() const override;
+ IntPoint lastKnownMousePosition() const override;
+ bool isHandlingWheelEvent() const override;
+ bool shouldSuspendScrollAnimations() const override;
+ IntRect scrollableAreaBoundingBox(bool* isInsideFixed = nullptr) const override;
+ bool isRubberBandInProgress() const override;
+ bool forceUpdateScrollbarsOnMainThreadForPerformanceTesting() const override;
+#if ENABLE(CSS_SCROLL_SNAP)
+ bool isScrollSnapInProgress() const override;
+#endif
+ bool usesMockScrollAnimator() const override;
+ void logMockScrollAnimatorMessage(const String&) const override;
#if PLATFORM(IOS)
void registerAsTouchEventListenerForScrolling();
@@ -1081,25 +903,25 @@ private:
LayoutRect scrollCornerAndResizerRect() const;
// NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
- void scrollTo(int, int);
+ void scrollTo(const ScrollPosition&);
void updateCompositingLayersAfterScroll();
- IntSize scrollbarOffset(const Scrollbar*) const;
+ IntSize scrollbarOffset(const Scrollbar&) const;
void updateScrollableAreaSet(bool hasOverflow);
+
+ bool allowsCurrentScroll() const;
void dirtyAncestorChainVisibleDescendantStatus();
void setAncestorChainHasVisibleDescendant();
- void updateDescendantDependentFlags(HashSet<const RenderObject*>* outOfFlowDescendantContainingBlocks = 0);
-#if USE(ACCELERATED_COMPOSITING)
- bool checkIfDescendantClippingContextNeedsUpdate(bool isClipping);
-#endif
+ void updateDescendantDependentFlags(HashSet<const RenderObject*>* outOfFlowDescendantContainingBlocks = nullptr);
- // This flag is computed by RenderLayerCompositor, which knows more about 3d hierarchies than we do.
- void setHas3DTransformedDescendant(bool b) { m_has3DTransformedDescendant = b; }
bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; }
-
+
+ bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
+ bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; }
+
void dirty3DTransformedDescendantStatus();
// Both updates the status, and returns true if descendants of this have 3d.
bool update3DTransformedDescendantStatus();
@@ -1107,22 +929,25 @@ private:
void createReflection();
void removeReflection();
- PassRef<RenderStyle> createReflectionStyle();
+ RenderStyle createReflectionStyle();
bool paintingInsideReflection() const { return m_paintingInsideReflection; }
void setPaintingInsideReflection(bool b) { m_paintingInsideReflection = b; }
-#if ENABLE(CSS_FILTERS)
void updateOrRemoveFilterClients();
void updateOrRemoveFilterEffectRenderer();
+
+#if ENABLE(CSS_COMPOSITING)
+ void updateAncestorChainHasBlendingDescendants();
+ void dirtyAncestorChainHasBlendingDescendants();
#endif
- void parentClipRects(const ClipRectsContext&, ClipRects&) const;
+ Ref<ClipRects> parentClipRects(const ClipRectsContext&) const;
ClipRect backgroundClipRect(const ClipRectsContext&) const;
- LayoutRect paintingExtent(const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, PaintBehavior);
-
RenderLayer* enclosingTransformedAncestor() const;
+ LayoutRect getRectToExpose(const LayoutRect& visibleRect, const LayoutRect& exposeRect, bool insideFixed, const ScrollAlignment& alignX, const ScrollAlignment& alignY) const;
+
// Convert a point in absolute coords into layer coords, taking transforms into account
LayoutPoint absoluteToContents(const LayoutPoint&) const;
@@ -1130,30 +955,25 @@ private:
void updateScrollCornerStyle();
void updateResizerStyle();
- void drawPlatformResizerImage(GraphicsContext*, const LayoutRect& resizerCornerRect);
+ void drawPlatformResizerImage(GraphicsContext&, const LayoutRect& resizerCornerRect);
void updatePagination();
-
- // FIXME: Temporary. Remove when new columns come online.
- bool useRegionBasedColumns() const;
-
-#if USE(ACCELERATED_COMPOSITING)
+
void setHasCompositingDescendant(bool b) { m_hasCompositingDescendant = b; }
- enum IndirectCompositingReason {
- NoIndirectCompositingReason,
- IndirectCompositingForStacking,
- IndirectCompositingForOverlap,
- IndirectCompositingForBackgroundLayer,
- IndirectCompositingForGraphicalEffect, // opacity, mask, filter, transform etc.
- IndirectCompositingForPerspective,
- IndirectCompositingForPreserve3D
+ enum class IndirectCompositingReason {
+ None,
+ Stacking,
+ Overlap,
+ BackgroundLayer,
+ GraphicalEffect, // opacity, mask, filter, transform etc.
+ Perspective,
+ Preserve3D
};
- void setIndirectCompositingReason(IndirectCompositingReason reason) { m_indirectCompositingReason = reason; }
+ void setIndirectCompositingReason(IndirectCompositingReason reason) { m_indirectCompositingReason = static_cast<unsigned>(reason); }
IndirectCompositingReason indirectCompositingReason() const { return static_cast<IndirectCompositingReason>(m_indirectCompositingReason); }
bool mustCompositeForIndirectReasons() const { return m_indirectCompositingReason; }
-#endif
// Returns true if z ordering would not change if this layer were a stacking container.
bool canBeStackingContainer() const;
@@ -1175,15 +995,20 @@ private:
bool overflowControlsIntersectRect(const IntRect& localRect) const;
- RenderLayer* hitTestFlowThreadIfRegion(RenderLayer*, const HitTestRequest&, HitTestResult&,
+ RenderLayer* hitTestFlowThreadIfRegionForFragments(const LayerFragments&, RenderLayer*, const HitTestRequest&, HitTestResult&,
const LayoutRect&, const HitTestLocation&,
- const HitTestingTransformState*, double*);
- void paintFlowThreadIfRegion(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, LayoutPoint, LayoutRect, bool);
- void mapLayerClipRectsToFragmentationLayer(RenderRegion*, ClipRects&) const;
+ const HitTestingTransformState*, double* zOffsetForDescendants,
+ double* zOffset, const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants);
+ void paintFlowThreadIfRegionForFragments(const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags);
+ bool mapLayerClipRectsToFragmentationLayer(ClipRects&) const;
+
+ RenderNamedFlowFragment* currentRenderNamedFlowFragment() const;
-private:
// The bitfields are up here so they will fall into the padding from ScrollableArea on 64-bit.
+ const bool m_isRootLayer : 1;
+ const bool m_forcedStackingContext : 1;
+
// Keeps track of whether the layer is currently resizing, so events can cause resizing to start and stop.
bool m_inResizeMode : 1;
@@ -1212,8 +1037,6 @@ private:
// able to safely become a stacking context.
bool m_descendantsAreContiguousInStackingOrder : 1;
- const bool m_isRootLayer : 1;
-
bool m_usedTransparency : 1; // Tracks whether we need to close a transparent layer, i.e., whether
// we ended up painting this layer or any descendants (and therefore need to
// blend).
@@ -1225,21 +1048,24 @@ private:
bool m_hasVisibleContent : 1;
bool m_visibleDescendantStatusDirty : 1;
bool m_hasVisibleDescendant : 1;
-
- bool m_isPaginated : 1; // If we think this layer is split by a multi-column ancestor, then this bit will be set.
+ bool m_registeredScrollableArea : 1;
bool m_3DTransformedDescendantStatusDirty : 1;
bool m_has3DTransformedDescendant : 1; // Set on a stacking context layer that has 3D descendants anywhere
// in a preserves3D hierarchy. Hint to do 3D-aware hit testing.
-#if USE(ACCELERATED_COMPOSITING)
bool m_hasCompositingDescendant : 1; // In the z-order tree.
+
+ bool m_hasTransformedAncestor : 1;
+ bool m_has3DTransformedAncestor : 1;
+
unsigned m_indirectCompositingReason : 3;
unsigned m_viewportConstrainedNotCompositedReason : 2;
-#endif
#if PLATFORM(IOS)
bool m_adjustForIOSCaretWhenScrolling : 1;
+#if ENABLE(IOS_TOUCH_EVENTS)
bool m_registeredAsTouchEventListenerForScrolling : 1;
+#endif
bool m_inUserScroll : 1;
bool m_requiresScrollBoundsOriginUpdate : 1;
#endif
@@ -1251,12 +1077,15 @@ private:
bool m_layerListMutationAllowed : 1;
#endif
-#if ENABLE(CSS_FILTERS)
bool m_hasFilterInfo : 1;
-#endif
+
+ bool m_hasComputedRepaintRect : 1;
#if ENABLE(CSS_COMPOSITING)
- BlendMode m_blendMode : 5;
+ unsigned m_blendMode : 5;
+ bool m_hasNotIsolatedCompositedBlendingDescendants : 1;
+ bool m_hasNotIsolatedBlendingDescendants : 1;
+ bool m_hasNotIsolatedBlendingDescendantsStatusDirty : 1;
#endif
RenderLayerModelObject& m_renderer;
@@ -1279,11 +1108,10 @@ private:
// The layer's width/height
IntSize m_layerSize;
- // This is the (scroll) offset from scrollOrigin().
- IntSize m_scrollOffset;
+ ScrollPosition m_scrollPosition;
// The width/height of our scrolled area.
- LayoutSize m_scrollSize;
+ IntSize m_scrollSize;
// For layers with overflow, we have a pair of scrollbars.
RefPtr<Scrollbar> m_hBar;
@@ -1293,24 +1121,24 @@ private:
// descendant layers within the stacking context that have z-indices of 0 or greater
// (auto will count as 0). m_negZOrderList holds descendants within our stacking context with negative
// z-indices.
- OwnPtr<Vector<RenderLayer*>> m_posZOrderList;
- OwnPtr<Vector<RenderLayer*>> m_negZOrderList;
+ std::unique_ptr<Vector<RenderLayer*>> m_posZOrderList;
+ std::unique_ptr<Vector<RenderLayer*>> m_negZOrderList;
// This list contains child layers that cannot create stacking contexts. For now it is just
// overflow layers, but that may change in the future.
- OwnPtr<Vector<RenderLayer*>> m_normalFlowList;
+ std::unique_ptr<Vector<RenderLayer*>> m_normalFlowList;
- OwnPtr<ClipRectsCache> m_clipRectsCache;
+ std::unique_ptr<ClipRectsCache> m_clipRectsCache;
IntPoint m_cachedOverlayScrollbarOffset;
- OwnPtr<RenderMarquee> m_marquee; // Used by layers with overflow:marquee
+ std::unique_ptr<RenderMarquee> m_marquee; // Used for <marquee>.
// Cached normal flow values for absolute positioned elements with static left/top values.
LayoutUnit m_staticInlinePosition;
LayoutUnit m_staticBlockPosition;
- OwnPtr<TransformationMatrix> m_transform;
+ std::unique_ptr<TransformationMatrix> m_transform;
// May ultimately be extended to many replicas (with their own paint order).
RenderPtr<RenderReplica> m_reflection;
@@ -1324,19 +1152,16 @@ private:
IntRect m_blockSelectionGapsBounds;
-#if USE(ACCELERATED_COMPOSITING)
- OwnPtr<RenderLayerBacking> m_backing;
-#endif
-
- class FilterInfo;
+ std::unique_ptr<RenderLayerBacking> m_backing;
};
inline void RenderLayer::clearZOrderLists()
{
ASSERT(!isStackingContainer());
+ ASSERT(m_layerListMutationAllowed);
- m_posZOrderList.clear();
- m_negZOrderList.clear();
+ m_posZOrderList = nullptr;
+ m_negZOrderList = nullptr;
}
inline void RenderLayer::updateZOrderLists()
@@ -1376,12 +1201,12 @@ private:
void makeMatrixRenderable(TransformationMatrix&, bool has3DRendering);
+bool compositedWithOwnBackingStore(const RenderLayer&);
+
} // namespace WebCore
-#ifndef NDEBUG
-// Outside the WebCore namespace for ease of invocation from gdb.
+#if ENABLE(TREE_DEBUGGING)
+// Outside the WebCore namespace for ease of invocation from lldb.
void showLayerTree(const WebCore::RenderLayer*);
void showLayerTree(const WebCore::RenderObject*);
#endif
-
-#endif // RenderLayer_h