OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/paint/PaintLayerPainter.h" | 6 #include "core/paint/PaintLayerPainter.h" |
7 | 7 |
8 #include "core/frame/Settings.h" | 8 #include "core/frame/Settings.h" |
9 #include "core/layout/ClipPathOperation.h" | 9 #include "core/layout/ClipPathOperation.h" |
10 #include "core/layout/LayoutBlock.h" | 10 #include "core/layout/LayoutBlock.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 { | 42 { |
43 // Avoid painting descendants of the root layer when stylesheets haven't loa
ded. This eliminates FOUC. | 43 // Avoid painting descendants of the root layer when stylesheets haven't loa
ded. This eliminates FOUC. |
44 // It's ok not to draw, because later on, when all the stylesheets do load,
updateStyleSelector on the Document | 44 // It's ok not to draw, because later on, when all the stylesheets do load,
updateStyleSelector on the Document |
45 // will do a full paintInvalidationForWholeLayoutObject(). | 45 // will do a full paintInvalidationForWholeLayoutObject(). |
46 if (layer->layoutObject()->document().didLayoutWithPendingStylesheets() && !
layer->isRootLayer() && !layer->layoutObject()->isDocumentElement()) | 46 if (layer->layoutObject()->document().didLayoutWithPendingStylesheets() && !
layer->isRootLayer() && !layer->layoutObject()->isDocumentElement()) |
47 return true; | 47 return true; |
48 | 48 |
49 return false; | 49 return false; |
50 } | 50 } |
51 | 51 |
52 void PaintLayerPainter::paint(GraphicsContext* context, const LayoutRect& damage
Rect, const GlobalPaintFlags globalPaintFlags, LayoutObject* paintingRoot, Paint
LayerFlags paintFlags) | 52 void PaintLayerPainter::paint(GraphicsContext& context, const LayoutRect& damage
Rect, const GlobalPaintFlags globalPaintFlags, LayoutObject* paintingRoot, Paint
LayerFlags paintFlags) |
53 { | 53 { |
54 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), globalPaintFlags, LayoutSize(), paintingRoot); | 54 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), globalPaintFlags, LayoutSize(), paintingRoot); |
55 if (shouldPaintLayerInSoftwareMode(globalPaintFlags, paintFlags)) | 55 if (shouldPaintLayerInSoftwareMode(globalPaintFlags, paintFlags)) |
56 paintLayer(context, paintingInfo, paintFlags); | 56 paintLayer(context, paintingInfo, paintFlags); |
57 } | 57 } |
58 | 58 |
59 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint
Flags, const LayoutObject* layoutObject) | 59 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint
Flags, const LayoutObject* layoutObject) |
60 { | 60 { |
61 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai
ntLayerPaintingChildClippingMaskPhase && layoutObject->hasClipPath())) ? IgnoreO
verflowClip : RespectOverflowClip; | 61 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai
ntLayerPaintingChildClippingMaskPhase && layoutObject->hasClipPath())) ? IgnoreO
verflowClip : RespectOverflowClip; |
62 } | 62 } |
63 | 63 |
64 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayer(GraphicsContext* co
ntext, const PaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) | 64 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayer(GraphicsContext& co
ntext, const PaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
65 { | 65 { |
66 // https://code.google.com/p/chromium/issues/detail?id=343772 | 66 // https://code.google.com/p/chromium/issues/detail?id=343772 |
67 DisableCompositingQueryAsserts disabler; | 67 DisableCompositingQueryAsserts disabler; |
68 | 68 |
69 if (m_paintLayer.compositingState() != NotComposited) { | 69 if (m_paintLayer.compositingState() != NotComposited) { |
70 if (paintingInfo.globalPaintFlags() & GlobalPaintFlattenCompositingLayer
s) { | 70 if (paintingInfo.globalPaintFlags() & GlobalPaintFlattenCompositingLayer
s) { |
71 // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? Th
at's for printing and drag-image. | 71 // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? Th
at's for printing and drag-image. |
72 // FIXME: why isn't the code here global, as opposed to being set on
each paintLayer() call? | 72 // FIXME: why isn't the code here global, as opposed to being set on
each paintLayer() call? |
73 paintFlags |= PaintLayerUncachedClipRects; | 73 paintFlags |= PaintLayerUncachedClipRects; |
74 } | 74 } |
(...skipping 11 matching lines...) Expand all Loading... |
86 if (m_paintLayer.layoutObject()->isLayoutPart() && toLayoutPart(m_paintLayer
.layoutObject())->isThrottledFrameView()) | 86 if (m_paintLayer.layoutObject()->isLayoutPart() && toLayoutPart(m_paintLayer
.layoutObject())->isThrottledFrameView()) |
87 return FullyPainted; | 87 return FullyPainted; |
88 | 88 |
89 // If this layer is totally invisible then there is nothing to paint. | 89 // If this layer is totally invisible then there is nothing to paint. |
90 if (!m_paintLayer.layoutObject()->opacity() && !m_paintLayer.layoutObject()-
>hasBackdropFilter()) | 90 if (!m_paintLayer.layoutObject()->opacity() && !m_paintLayer.layoutObject()-
>hasBackdropFilter()) |
91 return FullyPainted; | 91 return FullyPainted; |
92 | 92 |
93 if (m_paintLayer.paintsWithTransparency(paintingInfo.globalPaintFlags())) | 93 if (m_paintLayer.paintsWithTransparency(paintingInfo.globalPaintFlags())) |
94 paintFlags |= PaintLayerHaveTransparency; | 94 paintFlags |= PaintLayerHaveTransparency; |
95 | 95 |
96 LayerFixedPositionRecorder fixedPositionRecorder(*context, *m_paintLayer.lay
outObject()); | 96 LayerFixedPositionRecorder fixedPositionRecorder(context, *m_paintLayer.layo
utObject()); |
97 | 97 |
98 // PaintLayerAppliedTransform is used in LayoutReplica, to avoid applying th
e transform twice. | 98 // PaintLayerAppliedTransform is used in LayoutReplica, to avoid applying th
e transform twice. |
99 if (m_paintLayer.paintsWithTransform(paintingInfo.globalPaintFlags()) && !(p
aintFlags & PaintLayerAppliedTransform)) | 99 if (m_paintLayer.paintsWithTransform(paintingInfo.globalPaintFlags()) && !(p
aintFlags & PaintLayerAppliedTransform)) |
100 return paintLayerWithTransform(context, paintingInfo, paintFlags); | 100 return paintLayerWithTransform(context, paintingInfo, paintFlags); |
101 | 101 |
102 return paintLayerContentsAndReflection(context, paintingInfo, paintFlags); | 102 return paintLayerContentsAndReflection(context, paintingInfo, paintFlags); |
103 } | 103 } |
104 | 104 |
105 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContentsAndReflectio
n(GraphicsContext* context, const PaintLayerPaintingInfo& paintingInfo, PaintLay
erFlags paintFlags, FragmentPolicy fragmentPolicy) | 105 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContentsAndReflectio
n(GraphicsContext& context, const PaintLayerPaintingInfo& paintingInfo, PaintLay
erFlags paintFlags, FragmentPolicy fragmentPolicy) |
106 { | 106 { |
107 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay
erDescendant()); | 107 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay
erDescendant()); |
108 | 108 |
109 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform)
; | 109 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform)
; |
110 | 110 |
111 PaintResult result = FullyPainted; | 111 PaintResult result = FullyPainted; |
112 | 112 |
113 // Paint the reflection first if we have one. | 113 // Paint the reflection first if we have one. |
114 if (m_paintLayer.reflectionInfo()) { | 114 if (m_paintLayer.reflectionInfo()) { |
115 ScopeRecorder scopeRecorder(*context); | 115 ScopeRecorder scopeRecorder(context); |
116 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl
ags); | 116 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl
ags); |
117 result = MaybeNotFullyPainted; | 117 result = MaybeNotFullyPainted; |
118 } | 118 } |
119 | 119 |
120 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; | 120 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; |
121 if (paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolic
y) == MaybeNotFullyPainted) | 121 if (paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolic
y) == MaybeNotFullyPainted) |
122 result = MaybeNotFullyPainted; | 122 result = MaybeNotFullyPainted; |
123 | 123 |
124 return result; | 124 return result; |
125 } | 125 } |
126 | 126 |
127 class ClipPathHelper { | 127 class ClipPathHelper { |
128 public: | 128 public: |
129 ClipPathHelper(GraphicsContext* context, const PaintLayer& paintLayer, Paint
LayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRelat
iveBoundsComputed, | 129 ClipPathHelper(GraphicsContext& context, const PaintLayer& paintLayer, Paint
LayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRelat
iveBoundsComputed, |
130 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) | 130 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) |
131 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) | 131 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) |
132 { | 132 { |
133 const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); | 133 const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); |
134 | 134 |
135 // Clip-path, like border radius, must not be applied to the contents of
a composited-scrolling container. | 135 // Clip-path, like border radius, must not be applied to the contents of
a composited-scrolling container. |
136 // It must, however, still be applied to the mask layer, so that the com
positor can properly mask the | 136 // It must, however, still be applied to the mask layer, so that the com
positor can properly mask the |
137 // scrolling contents and scrollbars. | 137 // scrolling contents and scrollbars. |
138 if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompos
itedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) | 138 if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompos
itedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) |
139 return; | 139 return; |
140 | 140 |
141 m_clipperState = SVGClipPainter::ClipperNotApplied; | 141 m_clipperState = SVGClipPainter::ClipperNotApplied; |
142 | 142 |
143 paintingInfo.ancestorHasClipPathClipping = true; | 143 paintingInfo.ancestorHasClipPathClipping = true; |
144 | 144 |
145 ASSERT(style.clipPath()); | 145 ASSERT(style.clipPath()); |
146 if (style.clipPath()->type() == ClipPathOperation::SHAPE) { | 146 if (style.clipPath()->type() == ClipPathOperation::SHAPE) { |
147 ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.cl
ipPath()); | 147 ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.cl
ipPath()); |
148 if (clipPath->isValid()) { | 148 if (clipPath->isValid()) { |
149 if (!rootRelativeBoundsComputed) { | 149 if (!rootRelativeBoundsComputed) { |
150 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding
ReflectionAndStackingChildren(offsetFromRoot); | 150 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding
ReflectionAndStackingChildren(offsetFromRoot); |
151 rootRelativeBoundsComputed = true; | 151 rootRelativeBoundsComputed = true; |
152 } | 152 } |
153 m_clipPathRecorder.emplace(*context, *paintLayer.layoutObject(),
clipPath->path(FloatRect(rootRelativeBounds))); | 153 m_clipPathRecorder.emplace(context, *paintLayer.layoutObject(),
clipPath->path(FloatRect(rootRelativeBounds))); |
154 } | 154 } |
155 } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) { | 155 } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) { |
156 ReferenceClipPathOperation* referenceClipPathOperation = toReference
ClipPathOperation(style.clipPath()); | 156 ReferenceClipPathOperation* referenceClipPathOperation = toReference
ClipPathOperation(style.clipPath()); |
157 Document& document = paintLayer.layoutObject()->document(); | 157 Document& document = paintLayer.layoutObject()->document(); |
158 // FIXME: It doesn't work with forward or external SVG references (h
ttps://bugs.webkit.org/show_bug.cgi?id=90405) | 158 // FIXME: It doesn't work with forward or external SVG references (h
ttps://bugs.webkit.org/show_bug.cgi?id=90405) |
159 Element* element = document.getElementById(referenceClipPathOperatio
n->fragment()); | 159 Element* element = document.getElementById(referenceClipPathOperatio
n->fragment()); |
160 if (isSVGClipPathElement(element) && element->layoutObject()) { | 160 if (isSVGClipPathElement(element) && element->layoutObject()) { |
161 if (!rootRelativeBoundsComputed) { | 161 if (!rootRelativeBoundsComputed) { |
162 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding
ReflectionAndStackingChildren(offsetFromRoot); | 162 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding
ReflectionAndStackingChildren(offsetFromRoot); |
163 rootRelativeBoundsComputed = true; | 163 rootRelativeBoundsComputed = true; |
(...skipping 12 matching lines...) Expand all Loading... |
176 ~ClipPathHelper() | 176 ~ClipPathHelper() |
177 { | 177 { |
178 if (m_resourceClipper) | 178 if (m_resourceClipper) |
179 SVGClipPainter(*m_resourceClipper).finishEffect(*m_paintLayer.layout
Object(), m_context, m_clipperState); | 179 SVGClipPainter(*m_resourceClipper).finishEffect(*m_paintLayer.layout
Object(), m_context, m_clipperState); |
180 } | 180 } |
181 private: | 181 private: |
182 LayoutSVGResourceClipper* m_resourceClipper; | 182 LayoutSVGResourceClipper* m_resourceClipper; |
183 Optional<ClipPathRecorder> m_clipPathRecorder; | 183 Optional<ClipPathRecorder> m_clipPathRecorder; |
184 SVGClipPainter::ClipperState m_clipperState; | 184 SVGClipPainter::ClipperState m_clipperState; |
185 const PaintLayer& m_paintLayer; | 185 const PaintLayer& m_paintLayer; |
186 GraphicsContext* m_context; | 186 GraphicsContext& m_context; |
187 }; | 187 }; |
188 | 188 |
189 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContents(GraphicsCon
text* context, const PaintLayerPaintingInfo& paintingInfoArg, PaintLayerFlags pa
intFlags, FragmentPolicy fragmentPolicy) | 189 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContents(GraphicsCon
text& context, const PaintLayerPaintingInfo& paintingInfoArg, PaintLayerFlags pa
intFlags, FragmentPolicy fragmentPolicy) |
190 { | 190 { |
191 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay
erDescendant()); | 191 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay
erDescendant()); |
192 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); | 192 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); |
193 | 193 |
194 bool isSelfPaintingLayer = m_paintLayer.isSelfPaintingLayer(); | 194 bool isSelfPaintingLayer = m_paintLayer.isSelfPaintingLayer(); |
195 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr
ollbars; | 195 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr
ollbars; |
196 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing
ScrollingPhase; | 196 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing
ScrollingPhase; |
197 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi
tingForegroundPhase; | 197 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi
tingForegroundPhase; |
198 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi
tingBackgroundPhase; | 198 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi
tingBackgroundPhase; |
199 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon
tents; | 199 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon
tents; |
(...skipping 29 matching lines...) Expand all Loading... |
229 ClipRects* clipRects = m_paintLayer.clipper().paintingClipRects(painting
InfoArg.rootLayer, respectOverflowClip, subpixelAccumulation); | 229 ClipRects* clipRects = m_paintLayer.clipper().paintingClipRects(painting
InfoArg.rootLayer, respectOverflowClip, subpixelAccumulation); |
230 if (!m_paintLayer.needsRepaint()) { | 230 if (!m_paintLayer.needsRepaint()) { |
231 ClipRects* previousClipRects = m_paintLayer.previousPaintingClipRect
s(); | 231 ClipRects* previousClipRects = m_paintLayer.previousPaintingClipRect
s(); |
232 if (clipRects != previousClipRects && (!clipRects || !previousClipRe
cts || *clipRects != *previousClipRects)) | 232 if (clipRects != previousClipRects && (!clipRects || !previousClipRe
cts || *clipRects != *previousClipRects)) |
233 clipRectsChanged = true; | 233 clipRectsChanged = true; |
234 } | 234 } |
235 m_paintLayer.setPreviousPaintingClipRects(clipRects); | 235 m_paintLayer.setPreviousPaintingClipRects(clipRects); |
236 } | 236 } |
237 | 237 |
238 Optional<SubsequenceRecorder> subsequenceRecorder; | 238 Optional<SubsequenceRecorder> subsequenceRecorder; |
239 if (!context->printing() | 239 if (!context.printing() |
240 && !(paintingInfoArg.globalPaintFlags() & GlobalPaintFlattenCompositingL
ayers) | 240 && !(paintingInfoArg.globalPaintFlags() & GlobalPaintFlattenCompositingL
ayers) |
241 && !(paintFlags & (PaintLayerPaintingReflection | PaintLayerPaintingRoot
BackgroundOnly | PaintLayerPaintingOverlayScrollbars | PaintLayerUncachedClipRec
ts)) | 241 && !(paintFlags & (PaintLayerPaintingReflection | PaintLayerPaintingRoot
BackgroundOnly | PaintLayerPaintingOverlayScrollbars | PaintLayerUncachedClipRec
ts)) |
242 && m_paintLayer.stackingNode()->isStackingContext() | 242 && m_paintLayer.stackingNode()->isStackingContext() |
243 && PaintLayerStackingNodeIterator(*m_paintLayer.stackingNode(), AllChild
ren).next()) { | 243 && PaintLayerStackingNodeIterator(*m_paintLayer.stackingNode(), AllChild
ren).next()) { |
244 if (!m_paintLayer.needsRepaint() | 244 if (!m_paintLayer.needsRepaint() |
245 && !clipRectsChanged | 245 && !clipRectsChanged |
246 && paintingInfoArg.scrollOffsetAccumulation == m_paintLayer.previous
ScrollOffsetAccumulationForPainting() | 246 && paintingInfoArg.scrollOffsetAccumulation == m_paintLayer.previous
ScrollOffsetAccumulationForPainting() |
247 && SubsequenceRecorder::useCachedSubsequenceIfPossible(*context, m_p
aintLayer)) | 247 && SubsequenceRecorder::useCachedSubsequenceIfPossible(context, m_pa
intLayer)) |
248 return result; | 248 return result; |
249 subsequenceRecorder.emplace(*context, m_paintLayer); | 249 subsequenceRecorder.emplace(context, m_paintLayer); |
250 } | 250 } |
251 | 251 |
252 PaintLayerPaintingInfo paintingInfo = paintingInfoArg; | 252 PaintLayerPaintingInfo paintingInfo = paintingInfoArg; |
253 | 253 |
254 LayoutPoint offsetFromRoot; | 254 LayoutPoint offsetFromRoot; |
255 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); | 255 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); |
256 offsetFromRoot.move(subpixelAccumulation); | 256 offsetFromRoot.move(subpixelAccumulation); |
257 | 257 |
258 LayoutRect bounds = m_paintLayer.physicalBoundingBox(offsetFromRoot); | 258 LayoutRect bounds = m_paintLayer.physicalBoundingBox(offsetFromRoot); |
259 if (!paintingInfo.paintDirtyRect.contains(bounds)) | 259 if (!paintingInfo.paintDirtyRect.contains(bounds)) |
260 result = MaybeNotFullyPainted; | 260 result = MaybeNotFullyPainted; |
261 | 261 |
262 LayoutRect rootRelativeBounds; | 262 LayoutRect rootRelativeBounds; |
263 bool rootRelativeBoundsComputed = false; | 263 bool rootRelativeBoundsComputed = false; |
264 | 264 |
265 if (paintingInfo.ancestorHasClipPathClipping && m_paintLayer.layoutObject()-
>isPositioned()) | 265 if (paintingInfo.ancestorHasClipPathClipping && m_paintLayer.layoutObject()-
>isPositioned()) |
266 UseCounter::count(m_paintLayer.layoutObject()->document(), UseCounter::C
lipPathOfPositionedElement); | 266 UseCounter::count(m_paintLayer.layoutObject()->document(), UseCounter::C
lipPathOfPositionedElement); |
267 | 267 |
268 // These helpers output clip and compositing operations using a RAII pattern
. Stack-allocated-varibles are destructed in the reverse order of construction, | 268 // These helpers output clip and compositing operations using a RAII pattern
. Stack-allocated-varibles are destructed in the reverse order of construction, |
269 // so they are nested properly. | 269 // so they are nested properly. |
270 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelat
iveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); | 270 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelat
iveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); |
271 | 271 |
272 Optional<CompositingRecorder> compositingRecorder; | 272 Optional<CompositingRecorder> compositingRecorder; |
273 // Blending operations must be performed only with the nearest ancestor stac
king context. | 273 // Blending operations must be performed only with the nearest ancestor stac
king context. |
274 // Note that there is no need to composite if we're painting the root. | 274 // Note that there is no need to composite if we're painting the root. |
275 // FIXME: this should be unified further into PaintLayer::paintsWithTranspar
ency(). | 275 // FIXME: this should be unified further into PaintLayer::paintsWithTranspar
ency(). |
276 bool shouldCompositeForBlendMode = (!m_paintLayer.layoutObject()->isDocument
Element() || m_paintLayer.layoutObject()->isSVGRoot()) && m_paintLayer.stackingN
ode()->isStackingContext() && m_paintLayer.hasNonIsolatedDescendantWithBlendMode
(); | 276 bool shouldCompositeForBlendMode = (!m_paintLayer.layoutObject()->isDocument
Element() || m_paintLayer.layoutObject()->isSVGRoot()) && m_paintLayer.stackingN
ode()->isStackingContext() && m_paintLayer.hasNonIsolatedDescendantWithBlendMode
(); |
277 if (shouldCompositeForBlendMode || m_paintLayer.paintsWithTransparency(paint
ingInfo.globalPaintFlags())) { | 277 if (shouldCompositeForBlendMode || m_paintLayer.paintsWithTransparency(paint
ingInfo.globalPaintFlags())) { |
278 FloatRect compositingBounds = FloatRect(m_paintLayer.paintingExtent(pain
tingInfo.rootLayer, paintingInfo.subPixelAccumulation, paintingInfo.globalPaintF
lags())); | 278 FloatRect compositingBounds = FloatRect(m_paintLayer.paintingExtent(pain
tingInfo.rootLayer, paintingInfo.subPixelAccumulation, paintingInfo.globalPaintF
lags())); |
279 compositingRecorder.emplace(*context, *m_paintLayer.layoutObject(), | 279 compositingRecorder.emplace(context, *m_paintLayer.layoutObject(), |
280 WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_paintLayer.la
youtObject()->style()->blendMode()), | 280 WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_paintLayer.la
youtObject()->style()->blendMode()), |
281 m_paintLayer.layoutObject()->opacity(), &compositingBounds); | 281 m_paintLayer.layoutObject()->opacity(), &compositingBounds); |
282 } | 282 } |
283 | 283 |
284 PaintLayerPaintingInfo localPaintingInfo(paintingInfo); | 284 PaintLayerPaintingInfo localPaintingInfo(paintingInfo); |
285 localPaintingInfo.subPixelAccumulation = subpixelAccumulation; | 285 localPaintingInfo.subPixelAccumulation = subpixelAccumulation; |
286 | 286 |
287 PaintLayerFragments layerFragments; | 287 PaintLayerFragments layerFragments; |
288 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ | 288 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ |
289 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment. | 289 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment. |
(...skipping 19 matching lines...) Expand all Loading... |
309 if (localPaintingInfo.paintingRoot && !m_paintLayer.layoutObject()->isDescen
dantOf(localPaintingInfo.paintingRoot)) | 309 if (localPaintingInfo.paintingRoot && !m_paintLayer.layoutObject()->isDescen
dantOf(localPaintingInfo.paintingRoot)) |
310 paintingRootForLayoutObject = localPaintingInfo.paintingRoot; | 310 paintingRootForLayoutObject = localPaintingInfo.paintingRoot; |
311 | 311 |
312 { // Begin block for the lifetime of any filter. | 312 { // Begin block for the lifetime of any filter. |
313 FilterPainter filterPainter(m_paintLayer, context, offsetFromRoot, layer
Fragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect, localPainti
ngInfo, paintFlags, | 313 FilterPainter filterPainter(m_paintLayer, context, offsetFromRoot, layer
Fragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect, localPainti
ngInfo, paintFlags, |
314 rootRelativeBounds, rootRelativeBoundsComputed); | 314 rootRelativeBounds, rootRelativeBoundsComputed); |
315 | 315 |
316 Optional<ScopedPaintChunkProperties> scopedPaintChunkProperties; | 316 Optional<ScopedPaintChunkProperties> scopedPaintChunkProperties; |
317 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | 317 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
318 if (const auto* objectProperties = m_paintLayer.layoutObject()->obje
ctPaintProperties()) { | 318 if (const auto* objectProperties = m_paintLayer.layoutObject()->obje
ctPaintProperties()) { |
319 PaintChunkProperties properties(context->paintController().curre
ntPaintChunkProperties()); | 319 PaintChunkProperties properties(context.paintController().curren
tPaintChunkProperties()); |
320 if (TransformPaintPropertyNode* transform = objectProperties->tr
ansformForLayerContents()) | 320 if (TransformPaintPropertyNode* transform = objectProperties->tr
ansformForLayerContents()) |
321 properties.transform = transform; | 321 properties.transform = transform; |
322 if (EffectPaintPropertyNode* effect = objectProperties->effect()
) | 322 if (EffectPaintPropertyNode* effect = objectProperties->effect()
) |
323 properties.effect = effect; | 323 properties.effect = effect; |
324 scopedPaintChunkProperties.emplace(context->paintController(), p
roperties); | 324 scopedPaintChunkProperties.emplace(context.paintController(), pr
operties); |
325 } | 325 } |
326 } | 326 } |
327 | 327 |
328 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai
ntContent && !selectionOnly; | 328 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai
ntContent && !selectionOnly; |
329 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin
gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr
ound); | 329 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin
gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr
ound); |
330 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa
intContent; | 330 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa
intContent; |
331 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr
ound; | 331 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr
ound; |
332 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; | 332 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; |
333 | 333 |
334 if (shouldPaintBackground) { | 334 if (shouldPaintBackground) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 // overflow and a subsequent fragment doesn't intersect with the border
box of the layer | 397 // overflow and a subsequent fragment doesn't intersect with the border
box of the layer |
398 // (i.e. only contains an overflow portion of the layer), intersection w
ill fail. The reason | 398 // (i.e. only contains an overflow portion of the layer), intersection w
ill fail. The reason |
399 // for this is that fragment.layerBounds is set to the border box, not t
he bounding box, of | 399 // for this is that fragment.layerBounds is set to the border box, not t
he bounding box, of |
400 // the layer. | 400 // the layer. |
401 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac
kgroundRect.rect(), newOffsetFromRoot)) | 401 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac
kgroundRect.rect(), newOffsetFromRoot)) |
402 return true; | 402 return true; |
403 } | 403 } |
404 return false; | 404 return false; |
405 } | 405 } |
406 | 406 |
407 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerWithTransform(Graphi
csContext* context, const PaintLayerPaintingInfo& paintingInfo, PaintLayerFlags
paintFlags) | 407 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerWithTransform(Graphi
csContext& context, const PaintLayerPaintingInfo& paintingInfo, PaintLayerFlags
paintFlags) |
408 { | 408 { |
409 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint
ingInfo.globalPaintFlags()); | 409 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint
ingInfo.globalPaintFlags()); |
410 // If the transform can't be inverted, then don't paint anything. | 410 // If the transform can't be inverted, then don't paint anything. |
411 if (!layerTransform.isInvertible()) | 411 if (!layerTransform.isInvertible()) |
412 return FullyPainted; | 412 return FullyPainted; |
413 | 413 |
414 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer
here. | 414 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer
here. |
415 // m_paintLayer may be the "root", and then we should avoid looking at its p
arent. | 415 // m_paintLayer may be the "root", and then we should avoid looking at its p
arent. |
416 PaintLayer* parentLayer = m_paintLayer.parent(); | 416 PaintLayer* parentLayer = m_paintLayer.parent(); |
417 | 417 |
(...skipping 27 matching lines...) Expand all Loading... |
445 PaintLayerFragment fragment; | 445 PaintLayerFragment fragment; |
446 fragment.backgroundRect = paintingInfo.paintDirtyRect; | 446 fragment.backgroundRect = paintingInfo.paintDirtyRect; |
447 fragments.append(fragment); | 447 fragments.append(fragment); |
448 } | 448 } |
449 | 449 |
450 bool needsScope = fragments.size() > 1; | 450 bool needsScope = fragments.size() > 1; |
451 PaintResult result = FullyPainted; | 451 PaintResult result = FullyPainted; |
452 for (const auto& fragment : fragments) { | 452 for (const auto& fragment : fragments) { |
453 Optional<ScopeRecorder> scopeRecorder; | 453 Optional<ScopeRecorder> scopeRecorder; |
454 if (needsScope) | 454 if (needsScope) |
455 scopeRecorder.emplace(*context); | 455 scopeRecorder.emplace(context); |
456 Optional<LayerClipRecorder> clipRecorder; | 456 Optional<LayerClipRecorder> clipRecorder; |
457 if (parentLayer) { | 457 if (parentLayer) { |
458 ClipRect clipRectForFragment(ancestorBackgroundClipRect); | 458 ClipRect clipRectForFragment(ancestorBackgroundClipRect); |
459 clipRectForFragment.moveBy(fragment.paginationOffset); | 459 clipRectForFragment.moveBy(fragment.paginationOffset); |
460 clipRectForFragment.intersect(fragment.backgroundRect); | 460 clipRectForFragment.intersect(fragment.backgroundRect); |
461 if (clipRectForFragment.isEmpty()) | 461 if (clipRectForFragment.isEmpty()) |
462 continue; | 462 continue; |
463 if (needsToClip(paintingInfo, clipRectForFragment)) { | 463 if (needsToClip(paintingInfo, clipRectForFragment)) { |
464 if (m_paintLayer.layoutObject()->isPositioned() && clipRectForFr
agment.isClippedByClipCss()) | 464 if (m_paintLayer.layoutObject()->isPositioned() && clipRectForFr
agment.isClippedByClipCss()) |
465 UseCounter::count(m_paintLayer.layoutObject()->document(), U
seCounter::ClipCssOfPositionedElement); | 465 UseCounter::count(m_paintLayer.layoutObject()->document(), U
seCounter::ClipCssOfPositionedElement); |
466 clipRecorder.emplace(*context, *parentLayer->layoutObject(), Dis
playItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginati
onOffset, paintFlags); | 466 clipRecorder.emplace(context, *parentLayer->layoutObject(), Disp
layItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginatio
nOffset, paintFlags); |
467 } | 467 } |
468 } | 468 } |
469 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags,
fragment.paginationOffset) == MaybeNotFullyPainted) | 469 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags,
fragment.paginationOffset) == MaybeNotFullyPainted) |
470 result = MaybeNotFullyPainted; | 470 result = MaybeNotFullyPainted; |
471 } | 471 } |
472 return result; | 472 return result; |
473 } | 473 } |
474 | 474 |
475 PaintLayerPainter::PaintResult PaintLayerPainter::paintFragmentByApplyingTransfo
rm(GraphicsContext* context, const PaintLayerPaintingInfo& paintingInfo, PaintLa
yerFlags paintFlags, const LayoutPoint& fragmentTranslation) | 475 PaintLayerPainter::PaintResult PaintLayerPainter::paintFragmentByApplyingTransfo
rm(GraphicsContext& context, const PaintLayerPaintingInfo& paintingInfo, PaintLa
yerFlags paintFlags, const LayoutPoint& fragmentTranslation) |
476 { | 476 { |
477 // This involves subtracting out the position of the layer in our current co
ordinate space, but preserving | 477 // This involves subtracting out the position of the layer in our current co
ordinate space, but preserving |
478 // the accumulated error for sub-pixel layout. | 478 // the accumulated error for sub-pixel layout. |
479 LayoutPoint delta; | 479 LayoutPoint delta; |
480 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); | 480 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); |
481 delta.moveBy(fragmentTranslation); | 481 delta.moveBy(fragmentTranslation); |
482 TransformationMatrix transform(m_paintLayer.renderableTransform(paintingInfo
.globalPaintFlags())); | 482 TransformationMatrix transform(m_paintLayer.renderableTransform(paintingInfo
.globalPaintFlags())); |
483 IntPoint roundedDelta = roundedIntPoint(delta); | 483 IntPoint roundedDelta = roundedIntPoint(delta); |
484 transform.translateRight(roundedDelta.x(), roundedDelta.y()); | 484 transform.translateRight(roundedDelta.x(), roundedDelta.y()); |
485 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation
+ (delta - roundedDelta); | 485 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation
+ (delta - roundedDelta); |
486 | 486 |
487 // TODO(jbroman): Put the real transform origin here, instead of using a | 487 // TODO(jbroman): Put the real transform origin here, instead of using a |
488 // matrix with the origin baked in. | 488 // matrix with the origin baked in. |
489 FloatPoint3D transformOrigin; | 489 FloatPoint3D transformOrigin; |
490 Transform3DRecorder transform3DRecorder(*context, *m_paintLayer.layoutObject
(), DisplayItem::Transform3DElementTransform, transform, transformOrigin); | 490 Transform3DRecorder transform3DRecorder(context, *m_paintLayer.layoutObject(
), DisplayItem::Transform3DElementTransform, transform, transformOrigin); |
491 | 491 |
492 // Now do a paint with the root layer shifted to be us. | 492 // Now do a paint with the root layer shifted to be us. |
493 PaintLayerPaintingInfo transformedPaintingInfo(&m_paintLayer, LayoutRect(enc
losingIntRect(transform.inverse().mapRect(paintingInfo.paintDirtyRect))), painti
ngInfo.globalPaintFlags(), | 493 PaintLayerPaintingInfo transformedPaintingInfo(&m_paintLayer, LayoutRect(enc
losingIntRect(transform.inverse().mapRect(paintingInfo.paintDirtyRect))), painti
ngInfo.globalPaintFlags(), |
494 adjustedSubPixelAccumulation, paintingInfo.paintingRoot); | 494 adjustedSubPixelAccumulation, paintingInfo.paintingRoot); |
495 transformedPaintingInfo.ancestorHasClipPathClipping = paintingInfo.ancestorH
asClipPathClipping; | 495 transformedPaintingInfo.ancestorHasClipPathClipping = paintingInfo.ancestorH
asClipPathClipping; |
496 return paintLayerContentsAndReflection(context, transformedPaintingInfo, pai
ntFlags, ForceSingleFragment); | 496 return paintLayerContentsAndReflection(context, transformedPaintingInfo, pai
ntFlags, ForceSingleFragment); |
497 } | 497 } |
498 | 498 |
499 PaintLayerPainter::PaintResult PaintLayerPainter::paintChildren(unsigned childre
nToVisit, GraphicsContext* context, const PaintLayerPaintingInfo& paintingInfo,
PaintLayerFlags paintFlags) | 499 PaintLayerPainter::PaintResult PaintLayerPainter::paintChildren(unsigned childre
nToVisit, GraphicsContext& context, const PaintLayerPaintingInfo& paintingInfo,
PaintLayerFlags paintFlags) |
500 { | 500 { |
501 PaintResult result = FullyPainted; | 501 PaintResult result = FullyPainted; |
502 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) | 502 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) |
503 return result; | 503 return result; |
504 | 504 |
505 #if ENABLE(ASSERT) | 505 #if ENABLE(ASSERT) |
506 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); | 506 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); |
507 #endif | 507 #endif |
508 | 508 |
509 PaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode(), childr
enToVisit); | 509 PaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode(), childr
enToVisit); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 bool PaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPaintFlags gl
obalPaintFlags, PaintLayerFlags paintFlags) | 546 bool PaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPaintFlags gl
obalPaintFlags, PaintLayerFlags paintFlags) |
547 { | 547 { |
548 DisableCompositingQueryAsserts disabler; | 548 DisableCompositingQueryAsserts disabler; |
549 | 549 |
550 return m_paintLayer.compositingState() == NotComposited | 550 return m_paintLayer.compositingState() == NotComposited |
551 || (globalPaintFlags & GlobalPaintFlattenCompositingLayers) | 551 || (globalPaintFlags & GlobalPaintFlattenCompositingLayers) |
552 || ((paintFlags & PaintLayerPaintingReflection) && !m_paintLayer.has3DTr
ansform()) | 552 || ((paintFlags & PaintLayerPaintingReflection) && !m_paintLayer.has3DTr
ansform()) |
553 || paintForFixedRootBackground(&m_paintLayer, paintFlags); | 553 || paintForFixedRootBackground(&m_paintLayer, paintFlags); |
554 } | 554 } |
555 | 555 |
556 void PaintLayerPainter::paintOverflowControlsForFragments(const PaintLayerFragme
nts& layerFragments, GraphicsContext* context, const PaintLayerPaintingInfo& loc
alPaintingInfo, PaintLayerFlags paintFlags) | 556 void PaintLayerPainter::paintOverflowControlsForFragments(const PaintLayerFragme
nts& layerFragments, GraphicsContext& context, const PaintLayerPaintingInfo& loc
alPaintingInfo, PaintLayerFlags paintFlags) |
557 { | 557 { |
558 bool needsScope = layerFragments.size() > 1; | 558 bool needsScope = layerFragments.size() > 1; |
559 for (auto& fragment : layerFragments) { | 559 for (auto& fragment : layerFragments) { |
560 Optional<ScopeRecorder> scopeRecorder; | 560 Optional<ScopeRecorder> scopeRecorder; |
561 if (needsScope) | 561 if (needsScope) |
562 scopeRecorder.emplace(*context); | 562 scopeRecorder.emplace(context); |
563 | 563 |
564 Optional<LayerClipRecorder> clipRecorder; | 564 Optional<LayerClipRecorder> clipRecorder; |
565 | 565 |
566 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) | 566 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) |
567 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), Display
Item::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fr
agment.paginationOffset, paintFlags); | 567 clipRecorder.emplace(context, *m_paintLayer.layoutObject(), DisplayI
tem::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fra
gment.paginationOffset, paintFlags); |
568 if (PaintLayerScrollableArea* scrollableArea = m_paintLayer.scrollableAr
ea()) { | 568 if (PaintLayerScrollableArea* scrollableArea = m_paintLayer.scrollableAr
ea()) { |
569 CullRect cullRect(pixelSnappedIntRect(fragment.backgroundRect.rect()
)); | 569 CullRect cullRect(pixelSnappedIntRect(fragment.backgroundRect.rect()
)); |
570 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(*contex
t, roundedIntPoint(toPoint(fragment.layerBounds.location() - m_paintLayer.layout
BoxLocation())), cullRect, true); | 570 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context
, roundedIntPoint(toPoint(fragment.layerBounds.location() - m_paintLayer.layoutB
oxLocation())), cullRect, true); |
571 } | 571 } |
572 } | 572 } |
573 } | 573 } |
574 | 574 |
575 void PaintLayerPainter::paintFragmentWithPhase(PaintPhase phase, const PaintLaye
rFragment& fragment, GraphicsContext* context, const ClipRect& clipRect, const P
aintLayerPaintingInfo& paintingInfo, LayoutObject* paintingRootForLayoutObject,
PaintLayerFlags paintFlags, ClipState clipState) | 575 void PaintLayerPainter::paintFragmentWithPhase(PaintPhase phase, const PaintLaye
rFragment& fragment, GraphicsContext& context, const ClipRect& clipRect, const P
aintLayerPaintingInfo& paintingInfo, LayoutObject* paintingRootForLayoutObject,
PaintLayerFlags paintFlags, ClipState clipState) |
576 { | 576 { |
577 ASSERT(m_paintLayer.isSelfPaintingLayer()); | 577 ASSERT(m_paintLayer.isSelfPaintingLayer()); |
578 | 578 |
579 Optional<LayerClipRecorder> clipRecorder; | 579 Optional<LayerClipRecorder> clipRecorder; |
580 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p
aintingInfo, clipRect)) { | 580 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p
aintingInfo, clipRect)) { |
581 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT
ype(phase); | 581 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT
ype(phase); |
582 LayerClipRecorder::BorderRadiusClippingRule clippingRule; | 582 LayerClipRecorder::BorderRadiusClippingRule clippingRule; |
583 switch (phase) { | 583 switch (phase) { |
584 case PaintPhaseBlockBackground: // Background painting will handle clipp
ing to self. | 584 case PaintPhaseBlockBackground: // Background painting will handle clipp
ing to self. |
585 case PaintPhaseSelfOutline: | 585 case PaintPhaseSelfOutline: |
586 case PaintPhaseMask: // Mask painting will handle clipping to self. | 586 case PaintPhaseMask: // Mask painting will handle clipping to self. |
587 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; | 587 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; |
588 break; | 588 break; |
589 default: | 589 default: |
590 clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius; | 590 clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius; |
591 break; | 591 break; |
592 } | 592 } |
593 | 593 |
594 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), clipType, c
lipRect, &paintingInfo, fragment.paginationOffset, paintFlags, clippingRule); | 594 clipRecorder.emplace(context, *m_paintLayer.layoutObject(), clipType, cl
ipRect, &paintingInfo, fragment.paginationOffset, paintFlags, clippingRule); |
595 } | 595 } |
596 | 596 |
597 LayoutRect newCullRect(clipRect.rect()); | 597 LayoutRect newCullRect(clipRect.rect()); |
598 Optional<ScrollRecorder> scrollRecorder; | 598 Optional<ScrollRecorder> scrollRecorder; |
599 LayoutPoint paintOffset = toPoint(fragment.layerBounds.location() - m_paintL
ayer.layoutBoxLocation()); | 599 LayoutPoint paintOffset = toPoint(fragment.layerBounds.location() - m_paintL
ayer.layoutBoxLocation()); |
600 if (!paintingInfo.scrollOffsetAccumulation.isZero()) { | 600 if (!paintingInfo.scrollOffsetAccumulation.isZero()) { |
601 // As a descendant of the root layer, m_paintLayer's painting is not con
trolled by the ScrollRecorders | 601 // As a descendant of the root layer, m_paintLayer's painting is not con
trolled by the ScrollRecorders |
602 // created by BlockPainter of the ancestor layers up to the root layer,
so we need to issue ScrollRecorder | 602 // created by BlockPainter of the ancestor layers up to the root layer,
so we need to issue ScrollRecorder |
603 // for this layer seperately, with the scroll offset accumulated from th
e root layer to the parent of this | 603 // for this layer seperately, with the scroll offset accumulated from th
e root layer to the parent of this |
604 // layer, to get the same result as ScrollRecorder in BlockPainter. | 604 // layer, to get the same result as ScrollRecorder in BlockPainter. |
605 paintOffset += paintingInfo.scrollOffsetAccumulation; | 605 paintOffset += paintingInfo.scrollOffsetAccumulation; |
606 | 606 |
607 newCullRect.move(paintingInfo.scrollOffsetAccumulation); | 607 newCullRect.move(paintingInfo.scrollOffsetAccumulation); |
608 scrollRecorder.emplace(*context, *m_paintLayer.layoutObject(), phase, pa
intingInfo.scrollOffsetAccumulation); | 608 scrollRecorder.emplace(context, *m_paintLayer.layoutObject(), phase, pai
ntingInfo.scrollOffsetAccumulation); |
609 } | 609 } |
610 PaintInfo paintInfo(context, pixelSnappedIntRect(newCullRect), phase, painti
ngInfo.globalPaintFlags(), paintFlags, | 610 PaintInfo paintInfo(context, pixelSnappedIntRect(newCullRect), phase, painti
ngInfo.globalPaintFlags(), paintFlags, |
611 paintingRootForLayoutObject, paintingInfo.rootLayer->layoutObject()); | 611 paintingRootForLayoutObject, paintingInfo.rootLayer->layoutObject()); |
612 | 612 |
613 m_paintLayer.layoutObject()->paint(paintInfo, paintOffset); | 613 m_paintLayer.layoutObject()->paint(paintInfo, paintOffset); |
614 } | 614 } |
615 | 615 |
616 void PaintLayerPainter::paintBackgroundForFragments(const PaintLayerFragments& l
ayerFragments, GraphicsContext* context, | 616 void PaintLayerPainter::paintBackgroundForFragments(const PaintLayerFragments& l
ayerFragments, GraphicsContext& context, |
617 const LayoutRect& transparencyPaintDirtyRect, const PaintLayerPaintingInfo&
localPaintingInfo, | 617 const LayoutRect& transparencyPaintDirtyRect, const PaintLayerPaintingInfo&
localPaintingInfo, |
618 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) | 618 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) |
619 { | 619 { |
620 bool needsScope = layerFragments.size() > 1; | 620 bool needsScope = layerFragments.size() > 1; |
621 for (auto& fragment : layerFragments) { | 621 for (auto& fragment : layerFragments) { |
622 Optional<ScopeRecorder> scopeRecorder; | 622 Optional<ScopeRecorder> scopeRecorder; |
623 if (needsScope) | 623 if (needsScope) |
624 scopeRecorder.emplace(*context); | 624 scopeRecorder.emplace(context); |
625 paintFragmentWithPhase(PaintPhaseBlockBackground, fragment, context, fra
gment.backgroundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags
, HasNotClipped); | 625 paintFragmentWithPhase(PaintPhaseBlockBackground, fragment, context, fra
gment.backgroundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags
, HasNotClipped); |
626 } | 626 } |
627 } | 627 } |
628 | 628 |
629 void PaintLayerPainter::paintForegroundForFragments(const PaintLayerFragments& l
ayerFragments, GraphicsContext* context, | 629 void PaintLayerPainter::paintForegroundForFragments(const PaintLayerFragments& l
ayerFragments, GraphicsContext& context, |
630 const LayoutRect& transparencyPaintDirtyRect, const PaintLayerPaintingInfo&
localPaintingInfo, | 630 const LayoutRect& transparencyPaintDirtyRect, const PaintLayerPaintingInfo&
localPaintingInfo, |
631 LayoutObject* paintingRootForLayoutObject, bool selectionOnly, PaintLayerFla
gs paintFlags) | 631 LayoutObject* paintingRootForLayoutObject, bool selectionOnly, PaintLayerFla
gs paintFlags) |
632 { | 632 { |
633 // Optimize clipping for the single fragment case. | 633 // Optimize clipping for the single fragment case. |
634 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size()
== 1 && !layerFragments[0].foregroundRect.isEmpty(); | 634 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size()
== 1 && !layerFragments[0].foregroundRect.isEmpty(); |
635 ClipState clipState = HasNotClipped; | 635 ClipState clipState = HasNotClipped; |
636 Optional<LayerClipRecorder> clipRecorder; | 636 Optional<LayerClipRecorder> clipRecorder; |
637 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun
dRect)) { | 637 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun
dRect)) { |
638 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), DisplayItem
::ClipLayerForeground, layerFragments[0].foregroundRect, &localPaintingInfo, lay
erFragments[0].paginationOffset, paintFlags); | 638 clipRecorder.emplace(context, *m_paintLayer.layoutObject(), DisplayItem:
:ClipLayerForeground, layerFragments[0].foregroundRect, &localPaintingInfo, laye
rFragments[0].paginationOffset, paintFlags); |
639 clipState = HasClipped; | 639 clipState = HasClipped; |
640 } | 640 } |
641 | 641 |
642 // We have to loop through every fragment multiple times, since we have to i
ssue paint invalidations in each specific phase in order for | 642 // We have to loop through every fragment multiple times, since we have to i
ssue paint invalidations in each specific phase in order for |
643 // interleaving of the fragments to work properly. | 643 // interleaving of the fragments to work properly. |
644 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P
aintPhaseChildBlockBackgrounds, layerFragments, | 644 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P
aintPhaseChildBlockBackgrounds, layerFragments, |
645 context, localPaintingInfo, paintingRootForLayoutObject, paintFlags, cli
pState); | 645 context, localPaintingInfo, paintingRootForLayoutObject, paintFlags, cli
pState); |
646 | 646 |
647 if (!selectionOnly) { | 647 if (!selectionOnly) { |
648 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co
ntext, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipState); | 648 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co
ntext, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipState); |
649 paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragment
s, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipStat
e); | 649 paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragment
s, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipStat
e); |
650 paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragm
ents, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipS
tate); | 650 paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragm
ents, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipS
tate); |
651 } | 651 } |
652 } | 652 } |
653 | 653 |
654 void PaintLayerPainter::paintForegroundForFragmentsWithPhase(PaintPhase phase, c
onst PaintLayerFragments& layerFragments, GraphicsContext* context, | 654 void PaintLayerPainter::paintForegroundForFragmentsWithPhase(PaintPhase phase, c
onst PaintLayerFragments& layerFragments, GraphicsContext& context, |
655 const PaintLayerPaintingInfo& localPaintingInfo, LayoutObject* paintingRootF
orLayoutObject, PaintLayerFlags paintFlags, ClipState clipState) | 655 const PaintLayerPaintingInfo& localPaintingInfo, LayoutObject* paintingRootF
orLayoutObject, PaintLayerFlags paintFlags, ClipState clipState) |
656 { | 656 { |
657 bool needsScope = layerFragments.size() > 1; | 657 bool needsScope = layerFragments.size() > 1; |
658 for (auto& fragment : layerFragments) { | 658 for (auto& fragment : layerFragments) { |
659 if (!fragment.foregroundRect.isEmpty()) { | 659 if (!fragment.foregroundRect.isEmpty()) { |
660 Optional<ScopeRecorder> scopeRecorder; | 660 Optional<ScopeRecorder> scopeRecorder; |
661 if (needsScope) | 661 if (needsScope) |
662 scopeRecorder.emplace(*context); | 662 scopeRecorder.emplace(context); |
663 paintFragmentWithPhase(phase, fragment, context, fragment.foreground
Rect, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipState); | 663 paintFragmentWithPhase(phase, fragment, context, fragment.foreground
Rect, localPaintingInfo, paintingRootForLayoutObject, paintFlags, clipState); |
664 } | 664 } |
665 } | 665 } |
666 } | 666 } |
667 | 667 |
668 void PaintLayerPainter::paintOutlineForFragments(const PaintLayerFragments& laye
rFragments, GraphicsContext* context, const PaintLayerPaintingInfo& localPaintin
gInfo, | 668 void PaintLayerPainter::paintOutlineForFragments(const PaintLayerFragments& laye
rFragments, GraphicsContext& context, const PaintLayerPaintingInfo& localPaintin
gInfo, |
669 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) | 669 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) |
670 { | 670 { |
671 bool needsScope = layerFragments.size() > 1; | 671 bool needsScope = layerFragments.size() > 1; |
672 for (auto& fragment : layerFragments) { | 672 for (auto& fragment : layerFragments) { |
673 if (!fragment.backgroundRect.isEmpty()) { | 673 if (!fragment.backgroundRect.isEmpty()) { |
674 Optional<ScopeRecorder> scopeRecorder; | 674 Optional<ScopeRecorder> scopeRecorder; |
675 if (needsScope) | 675 if (needsScope) |
676 scopeRecorder.emplace(*context); | 676 scopeRecorder.emplace(context); |
677 paintFragmentWithPhase(PaintPhaseSelfOutline, fragment, context, fra
gment.backgroundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags
, HasNotClipped); | 677 paintFragmentWithPhase(PaintPhaseSelfOutline, fragment, context, fra
gment.backgroundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags
, HasNotClipped); |
678 } | 678 } |
679 } | 679 } |
680 } | 680 } |
681 | 681 |
682 void PaintLayerPainter::paintMaskForFragments(const PaintLayerFragments& layerFr
agments, GraphicsContext* context, const PaintLayerPaintingInfo& localPaintingIn
fo, | 682 void PaintLayerPainter::paintMaskForFragments(const PaintLayerFragments& layerFr
agments, GraphicsContext& context, const PaintLayerPaintingInfo& localPaintingIn
fo, |
683 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) | 683 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) |
684 { | 684 { |
685 bool needsScope = layerFragments.size() > 1; | 685 bool needsScope = layerFragments.size() > 1; |
686 for (auto& fragment : layerFragments) { | 686 for (auto& fragment : layerFragments) { |
687 Optional<ScopeRecorder> scopeRecorder; | 687 Optional<ScopeRecorder> scopeRecorder; |
688 if (needsScope) | 688 if (needsScope) |
689 scopeRecorder.emplace(*context); | 689 scopeRecorder.emplace(context); |
690 paintFragmentWithPhase(PaintPhaseMask, fragment, context, fragment.backg
roundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags, HasNotCli
pped); | 690 paintFragmentWithPhase(PaintPhaseMask, fragment, context, fragment.backg
roundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags, HasNotCli
pped); |
691 } | 691 } |
692 } | 692 } |
693 | 693 |
694 void PaintLayerPainter::paintChildClippingMaskForFragments(const PaintLayerFragm
ents& layerFragments, GraphicsContext* context, const PaintLayerPaintingInfo& lo
calPaintingInfo, | 694 void PaintLayerPainter::paintChildClippingMaskForFragments(const PaintLayerFragm
ents& layerFragments, GraphicsContext& context, const PaintLayerPaintingInfo& lo
calPaintingInfo, |
695 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) | 695 LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags) |
696 { | 696 { |
697 bool needsScope = layerFragments.size() > 1; | 697 bool needsScope = layerFragments.size() > 1; |
698 for (auto& fragment: layerFragments) { | 698 for (auto& fragment: layerFragments) { |
699 Optional<ScopeRecorder> scopeRecorder; | 699 Optional<ScopeRecorder> scopeRecorder; |
700 if (needsScope) | 700 if (needsScope) |
701 scopeRecorder.emplace(*context); | 701 scopeRecorder.emplace(context); |
702 paintFragmentWithPhase(PaintPhaseClippingMask, fragment, context, fragme
nt.foregroundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags, H
asNotClipped); | 702 paintFragmentWithPhase(PaintPhaseClippingMask, fragment, context, fragme
nt.foregroundRect, localPaintingInfo, paintingRootForLayoutObject, paintFlags, H
asNotClipped); |
703 } | 703 } |
704 } | 704 } |
705 | 705 |
706 void PaintLayerPainter::paintOverlayScrollbars(GraphicsContext* context, const L
ayoutRect& damageRect, const GlobalPaintFlags paintFlags, LayoutObject* painting
Root) | 706 void PaintLayerPainter::paintOverlayScrollbars(GraphicsContext& context, const L
ayoutRect& damageRect, const GlobalPaintFlags paintFlags, LayoutObject* painting
Root) |
707 { | 707 { |
708 if (!m_paintLayer.containsDirtyOverlayScrollbars()) | 708 if (!m_paintLayer.containsDirtyOverlayScrollbars()) |
709 return; | 709 return; |
710 | 710 |
711 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), paintFlags, LayoutSize(), paintingRoot); | 711 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), paintFlags, LayoutSize(), paintingRoot); |
712 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); | 712 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); |
713 | 713 |
714 m_paintLayer.setContainsDirtyOverlayScrollbars(false); | 714 m_paintLayer.setContainsDirtyOverlayScrollbars(false); |
715 } | 715 } |
716 | 716 |
717 } // namespace blink | 717 } // namespace blink |
OLD | NEW |