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/DeprecatedPaintLayerPainter.h" | 6 #include "core/paint/DeprecatedPaintLayerPainter.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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
103 ScopeRecorder scopeRecorder(*context); | 103 ScopeRecorder scopeRecorder(*context); |
104 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl ags | PaintLayerPaintingReflection); | 104 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl ags | PaintLayerPaintingReflection); |
105 } | 105 } |
106 | 106 |
107 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; | 107 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; |
108 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy); | 108 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy); |
109 } | 109 } |
110 | 110 |
111 class ClipPathHelper { | 111 class ClipPathHelper { |
112 public: | 112 public: |
113 ClipPathHelper(GraphicsContext* context, const DeprecatedPaintLayer& paintLa yer, const DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutRect& rootRelat iveBounds, bool& rootRelativeBoundsComputed, | 113 ClipPathHelper(GraphicsContext* context, const DeprecatedPaintLayer& paintLa yer, const LayoutRect& interestRect, LayoutRect& rootRelativeBounds, bool& rootR elativeBoundsComputed, |
114 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) | 114 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) |
115 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) | 115 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) |
116 { | 116 { |
117 const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); | 117 const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); |
118 | 118 |
119 // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container. | 119 // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container. |
120 // It must, however, still be applied to the mask layer, so that the com positor can properly mask the | 120 // It must, however, still be applied to the mask layer, so that the com positor can properly mask the |
121 // scrolling contents and scrollbars. | 121 // scrolling contents and scrollbars. |
122 if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompos itedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) | 122 if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompos itedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) |
123 return; | 123 return; |
124 | 124 |
125 m_clipperState = SVGClipPainter::ClipperNotApplied; | 125 m_clipperState = SVGClipPainter::ClipperNotApplied; |
126 | 126 |
127 ASSERT(style.clipPath()); | 127 ASSERT(style.clipPath()); |
128 if (style.clipPath()->type() == ClipPathOperation::SHAPE) { | 128 if (style.clipPath()->type() == ClipPathOperation::SHAPE) { |
129 ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.cl ipPath()); | 129 ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.cl ipPath()); |
130 if (clipPath->isValid()) { | 130 if (clipPath->isValid()) { |
131 if (!rootRelativeBoundsComputed) { | 131 if (!rootRelativeBoundsComputed) { |
132 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot); | 132 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(offsetFromRoot); |
133 rootRelativeBoundsComputed = true; | 133 rootRelativeBoundsComputed = true; |
134 } | 134 } |
135 m_clipPathRecorder.emplace(*context, *paintLayer.layoutObject(), clipPath->path(rootRelativeBounds)); | 135 m_clipPathRecorder.emplace(*context, *paintLayer.layoutObject(), clipPath->path(rootRelativeBounds)); |
136 } | 136 } |
137 } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) { | 137 } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) { |
138 ReferenceClipPathOperation* referenceClipPathOperation = toReference ClipPathOperation(style.clipPath()); | 138 ReferenceClipPathOperation* referenceClipPathOperation = toReference ClipPathOperation(style.clipPath()); |
139 Document& document = paintLayer.layoutObject()->document(); | 139 Document& document = paintLayer.layoutObject()->document(); |
140 // FIXME: It doesn't work with forward or external SVG references (h ttps://bugs.webkit.org/show_bug.cgi?id=90405) | 140 // FIXME: It doesn't work with forward or external SVG references (h ttps://bugs.webkit.org/show_bug.cgi?id=90405) |
141 Element* element = document.getElementById(referenceClipPathOperatio n->fragment()); | 141 Element* element = document.getElementById(referenceClipPathOperatio n->fragment()); |
142 if (isSVGClipPathElement(element) && element->layoutObject()) { | 142 if (isSVGClipPathElement(element) && element->layoutObject()) { |
143 if (!rootRelativeBoundsComputed) { | 143 if (!rootRelativeBoundsComputed) { |
144 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot); | 144 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(offsetFromRoot); |
145 rootRelativeBoundsComputed = true; | 145 rootRelativeBoundsComputed = true; |
146 } | 146 } |
147 | 147 |
148 m_resourceClipper = toLayoutSVGResourceClipper(toLayoutSVGResour ceContainer(element->layoutObject())); | 148 m_resourceClipper = toLayoutSVGResourceClipper(toLayoutSVGResour ceContainer(element->layoutObject())); |
149 if (!SVGClipPainter(*m_resourceClipper).applyClippingToContext(* paintLayer.layoutObject(), rootRelativeBounds, | 149 if (!SVGClipPainter(*m_resourceClipper).applyClippingToContext(* paintLayer.layoutObject(), rootRelativeBounds, |
150 paintingInfo.paintDirtyRect, context, m_clipperState)) { | 150 interestRect, context, m_clipperState)) { |
151 // No need to post-apply the clipper if this failed. | 151 // No need to post-apply the clipper if this failed. |
152 m_resourceClipper = 0; | 152 m_resourceClipper = 0; |
153 } | 153 } |
154 } | 154 } |
155 } | 155 } |
156 } | 156 } |
157 | 157 |
158 ~ClipPathHelper() | 158 ~ClipPathHelper() |
159 { | 159 { |
160 if (m_resourceClipper) | 160 if (m_resourceClipper) |
(...skipping 28 matching lines...) Expand all Loading... | |
189 && ((isPaintingScrollingContent && isPaintingCompositedBackground) | 189 && ((isPaintingScrollingContent && isPaintingCompositedBackground) |
190 || (!isPaintingScrollingContent && isPaintingCompositedForeground)); | 190 || (!isPaintingScrollingContent && isPaintingCompositedForeground)); |
191 bool shouldPaintContent = m_paintLayer.hasVisibleContent() && isSelfPainting Layer && !isPaintingOverlayScrollbars; | 191 bool shouldPaintContent = m_paintLayer.hasVisibleContent() && isSelfPainting Layer && !isPaintingOverlayScrollbars; |
192 | 192 |
193 if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layou tObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement()) | 193 if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layou tObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement()) |
194 return; | 194 return; |
195 | 195 |
196 // Ensure our lists are up-to-date. | 196 // Ensure our lists are up-to-date. |
197 m_paintLayer.stackingNode()->updateLayerListsIfNeeded(); | 197 m_paintLayer.stackingNode()->updateLayerListsIfNeeded(); |
198 | 198 |
199 LayoutPoint offsetFromRoot; | 199 LayoutPoint offsetFromRoot = toLayoutPoint(paintingInfo.subPixelAccumulation ); |
200 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); | 200 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
201 | 201 m_paintLayer.convertToLayerCoordsSansOverflowScroll(paintingInfo.rootLay er, offsetFromRoot); |
202 if (m_paintLayer.compositingState() == PaintsIntoOwnBacking) | |
203 offsetFromRoot.move(m_paintLayer.subpixelAccumulation()); | |
204 else | 202 else |
205 offsetFromRoot.move(paintingInfo.subPixelAccumulation); | 203 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot ); |
206 | 204 |
207 LayoutRect rootRelativeBounds; | 205 LayoutRect rootRelativeBounds; |
208 bool rootRelativeBoundsComputed = false; | 206 bool rootRelativeBoundsComputed = false; |
209 | 207 |
210 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction, | 208 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction, |
211 // so they are nested properly. | 209 // so they are nested properly. |
212 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelat iveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); | 210 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo.paintDirty Rect, rootRelativeBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags ); |
213 | 211 |
214 Optional<LayerClipRecorder> clipRecorder; | 212 Optional<LayerClipRecorder> clipRecorder; |
215 Optional<CompositingRecorder> compositingRecorder; | 213 Optional<CompositingRecorder> compositingRecorder; |
216 // Blending operations must be performed only with the nearest ancestor stac king context. | 214 // Blending operations must be performed only with the nearest ancestor stac king context. |
217 // Note that there is no need to composite if we're painting the root. | 215 // Note that there is no need to composite if we're painting the root. |
218 // FIXME: this should be unified further into DeprecatedPaintLayer::paintsWi thTransparency(). | 216 // FIXME: this should be unified further into DeprecatedPaintLayer::paintsWi thTransparency(). |
219 bool shouldCompositeForBlendMode = (!m_paintLayer.layoutObject()->isDocument Element() || m_paintLayer.layoutObject()->isSVGRoot()) && m_paintLayer.stackingN ode()->isStackingContext() && m_paintLayer.hasNonIsolatedDescendantWithBlendMode (); | 217 bool shouldCompositeForBlendMode = (!m_paintLayer.layoutObject()->isDocument Element() || m_paintLayer.layoutObject()->isSVGRoot()) && m_paintLayer.stackingN ode()->isStackingContext() && m_paintLayer.hasNonIsolatedDescendantWithBlendMode (); |
220 if (shouldCompositeForBlendMode || m_paintLayer.paintsWithTransparency(paint ingInfo.globalPaintFlags())) { | 218 if (shouldCompositeForBlendMode || m_paintLayer.paintsWithTransparency(paint ingInfo.globalPaintFlags())) { |
221 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), DisplayItem ::TransparencyClip, | 219 // TODO(trchen): The transparent clip serves the purpose of raster hint for Skia, |
pdr.
2015/08/25 20:47:55
Can we fix this before landing your patch? I agree
trchen
2015/08/26 07:39:04
Done.
| |
222 m_paintLayer.paintingExtent(paintingInfo.rootLayer, paintingInfo.pai ntDirtyRect, paintingInfo.globalPaintFlags()), | 220 // so the Skia layer can be sized according to the bounding box of conte nts being |
223 &paintingInfo, LayoutPoint(), paintFlags); | 221 // composited. The clip itself should be no-op, but will actually cause anti-alias |
222 // artifact for transformed contents. Should remove this and use the 'bo unds' parameter | |
223 // in CompositingRecorder instead. | |
224 // For SPv2 the compositing bounds is unknown until layerization and imp l-side animation | |
225 // has been applied. It should be computed using display item cull rects at a later stage. | |
226 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | |
227 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), Display Item::TransparencyClip, | |
228 m_paintLayer.paintingExtent(paintingInfo.rootLayer, paintingInfo .paintDirtyRect, paintingInfo.globalPaintFlags()), | |
229 &paintingInfo, LayoutPoint(), paintFlags); | |
230 } | |
224 | 231 |
225 compositingRecorder.emplace(*context, *m_paintLayer.layoutObject(), | 232 compositingRecorder.emplace(*context, *m_paintLayer.layoutObject(), |
226 WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_paintLayer.la youtObject()->style()->blendMode()), | 233 WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_paintLayer.la youtObject()->style()->blendMode()), |
227 m_paintLayer.layoutObject()->opacity()); | 234 m_paintLayer.layoutObject()->opacity()); |
228 } | 235 } |
229 | 236 |
230 DeprecatedPaintLayerPaintingInfo localPaintingInfo(paintingInfo); | |
231 if (m_paintLayer.compositingState() == PaintsIntoOwnBacking) | |
232 localPaintingInfo.subPixelAccumulation = m_paintLayer.subpixelAccumulati on(); | |
233 | |
234 DeprecatedPaintLayerFragments layerFragments; | 237 DeprecatedPaintLayerFragments layerFragments; |
235 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) { | 238 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) { |
236 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment. | 239 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment. |
237 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects; | 240 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects; |
238 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_paintLayer.layoutObject()); | 241 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_paintLayer.layoutObject()); |
239 if (fragmentPolicy == ForceSingleFragment) | 242 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
240 m_paintLayer.appendSingleFragmentIgnoringPagination(layerFragments, localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect, cacheSlot, Ignore OverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.su bPixelAccumulation); | 243 // TODO(trchen): Need to handle layer fragmentation. |
241 else | 244 DeprecatedPaintLayerFragment fragment; |
242 m_paintLayer.collectFragments(layerFragments, localPaintingInfo.root Layer, localPaintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.subPixelAccumulation); | 245 fragment.layerBounds = LayoutRect(offsetFromRoot, LayoutSize(m_paint Layer.size())); |
246 fragment.backgroundRect = LayoutRect::infiniteRect(); | |
247 fragment.foregroundRect = LayoutRect::infiniteRect(); | |
248 fragment.outlineRect = LayoutRect::infiniteRect(); | |
249 layerFragments.append(fragment); | |
250 } else if (fragmentPolicy == ForceSingleFragment) { | |
251 m_paintLayer.appendSingleFragmentIgnoringPagination(layerFragments, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScr ollbarSize, respectOverflowClip, &offsetFromRoot, paintingInfo.subPixelAccumulat ion); | |
252 } else { | |
253 m_paintLayer.collectFragments(layerFragments, paintingInfo.rootLayer , paintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOve rflowClip, &offsetFromRoot, paintingInfo.subPixelAccumulation); | |
254 } | |
255 | |
243 if (shouldPaintContent) | 256 if (shouldPaintContent) |
244 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, localPaintingInfo, paintFlags, offsetFromRoot); | 257 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, paintingInfo, paintFlags, offsetFromRoot); |
245 } | 258 } |
246 | 259 |
247 bool selectionOnly = localPaintingInfo.globalPaintFlags() & GlobalPaintSelec tionOnly; | 260 bool selectionOnly = paintingInfo.globalPaintFlags() & GlobalPaintSelectionO nly; |
248 // If this layer's layoutObject is a child of the paintingRoot, we paint unc onditionally, which | 261 // If this layer's layoutObject is a child of the paintingRoot, we paint unc onditionally, which |
249 // is done by passing a nil paintingRoot down to our layoutObject (as if no paintingRoot was ever set). | 262 // is done by passing a nil paintingRoot down to our layoutObject (as if no paintingRoot was ever set). |
250 // Else, our layout tree may or may not contain the painting root, so we pas s that root along | 263 // Else, our layout tree may or may not contain the painting root, so we pas s that root along |
251 // so it will be tested against as we descend through the layoutObjects. | 264 // so it will be tested against as we descend through the layoutObjects. |
252 LayoutObject* paintingRootForLayoutObject = 0; | 265 LayoutObject* paintingRootForLayoutObject = 0; |
253 if (localPaintingInfo.paintingRoot && !m_paintLayer.layoutObject()->isDescen dantOf(localPaintingInfo.paintingRoot)) | 266 if (paintingInfo.paintingRoot && !m_paintLayer.layoutObject()->isDescendantO f(paintingInfo.paintingRoot)) |
254 paintingRootForLayoutObject = localPaintingInfo.paintingRoot; | 267 paintingRootForLayoutObject = paintingInfo.paintingRoot; |
255 | 268 |
256 { // Begin block for the lifetime of any filter. | 269 { // Begin block for the lifetime of any filter. |
257 FilterPainter filterPainter(m_paintLayer, context, offsetFromRoot, layer Fragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect, localPainti ngInfo, paintFlags, | 270 // FilterRecorder may mutate paintingInfo. |
271 DeprecatedPaintLayerPaintingInfo localPaintingInfo(paintingInfo); | |
272 ClipRect compositingBound; | |
273 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | |
274 // Similar to transparency clip above, for SPv2 the compositing boun d is only | |
275 // known since layerization and impl-side animation has been applied . | |
276 compositingBound = localPaintingInfo.paintDirtyRect; | |
277 } else if (!layerFragments.isEmpty()) { | |
278 // TODO(trchen): Using layerFragments[0].backgroundRect as compositi ng bound is | |
279 // incorrect. Using the union of the fragment clip rects could be a workaround | |
280 // but is still wrong in operation order. Conceptually it should be equivalent | |
281 // as painting the filtered stacking context as a whole, then cut th e results into | |
282 // fragments for pasting. | |
283 compositingBound = layerFragments[0].backgroundRect; | |
284 } | |
285 FilterPainter filterPainter(m_paintLayer, context, offsetFromRoot, compo sitingBound, localPaintingInfo, paintFlags, | |
258 rootRelativeBounds, rootRelativeBoundsComputed); | 286 rootRelativeBounds, rootRelativeBoundsComputed); |
259 | 287 |
260 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly; | 288 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly; |
261 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound); | 289 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound); |
262 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent; | 290 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent; |
263 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound; | 291 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound; |
264 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; | 292 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; |
265 | 293 |
266 if (shouldPaintBackground) { | 294 if (shouldPaintBackground) { |
267 paintBackgroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, | 295 paintBackgroundForFragments(layerFragments, context, localPaintingIn fo.paintDirtyRect, |
268 localPaintingInfo, paintingRootForLayoutObject, paintFlags); | 296 localPaintingInfo, paintingRootForLayoutObject, paintFlags); |
269 } | 297 } |
270 | 298 |
271 if (shouldPaintNegZOrderList) | 299 if (shouldPaintNegZOrderList) |
272 paintChildren(NegativeZOrderChildren, context, paintingInfo, paintFl ags); | 300 paintChildren(NegativeZOrderChildren, context, localPaintingInfo, pa intFlags); |
273 | 301 |
274 if (shouldPaintOwnContents) { | 302 if (shouldPaintOwnContents) { |
275 paintForegroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, | 303 paintForegroundForFragments(layerFragments, context, localPaintingIn fo.paintDirtyRect, |
276 localPaintingInfo, paintingRootForLayoutObject, selectionOnly, p aintFlags); | 304 localPaintingInfo, paintingRootForLayoutObject, selectionOnly, p aintFlags); |
277 } | 305 } |
278 | 306 |
279 if (shouldPaintOutline) | 307 if (shouldPaintOutline) |
280 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags); | 308 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags); |
281 | 309 |
282 if (shouldPaintNormalFlowAndPosZOrderLists) | 310 if (shouldPaintNormalFlowAndPosZOrderLists) |
283 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, paintingInfo, paintFlags); | 311 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, localPaintingInfo, paintFlags); |
284 | 312 |
285 if (shouldPaintOverlayScrollbars) | 313 if (shouldPaintOverlayScrollbars) |
286 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags); | 314 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags); |
287 } // FilterPainter block | 315 } // FilterPainter block |
288 | 316 |
289 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn ly; | 317 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn ly; |
290 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly; | 318 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly; |
291 | 319 |
292 if (shouldPaintMask) | 320 if (shouldPaintMask) |
293 paintMaskForFragments(layerFragments, context, localPaintingInfo, painti ngRootForLayoutObject, paintFlags); | 321 paintMaskForFragments(layerFragments, context, paintingInfo, paintingRoo tForLayoutObject, paintFlags); |
294 if (shouldPaintClippingMask) { | 322 if (shouldPaintClippingMask) { |
295 // Paint the border radius mask for the fragments. | 323 // Paint the border radius mask for the fragments. |
296 paintChildClippingMaskForFragments(layerFragments, context, localPaintin gInfo, paintingRootForLayoutObject, paintFlags); | 324 paintChildClippingMaskForFragments(layerFragments, context, paintingInfo , paintingRootForLayoutObject, paintFlags); |
297 } | 325 } |
298 } | 326 } |
299 | 327 |
300 bool DeprecatedPaintLayerPainter::needsToClip(const DeprecatedPaintLayerPainting Info& localPaintingInfo, const ClipRect& clipRect) | 328 bool DeprecatedPaintLayerPainter::needsToClip(const DeprecatedPaintLayerPainting Info& localPaintingInfo, const ClipRect& clipRect) |
301 { | 329 { |
302 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius(); | 330 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius(); |
303 } | 331 } |
304 | 332 |
305 bool DeprecatedPaintLayerPainter::atLeastOneFragmentIntersectsDamageRect(Depreca tedPaintLayerFragments& fragments, const DeprecatedPaintLayerPaintingInfo& local PaintingInfo, PaintLayerFlags localPaintFlags, const LayoutPoint& offsetFromRoot ) | 333 bool DeprecatedPaintLayerPainter::atLeastOneFragmentIntersectsDamageRect(Depreca tedPaintLayerFragments& fragments, const DeprecatedPaintLayerPaintingInfo& local PaintingInfo, PaintLayerFlags localPaintFlags, const LayoutPoint& offsetFromRoot ) |
306 { | 334 { |
307 if (m_paintLayer.enclosingPaginationLayer()) | 335 if (m_paintLayer.enclosingPaginationLayer()) |
308 return true; // The fragments created have already been found to interse ct with the damage rect. | 336 return true; // The fragments created have already been found to interse ct with the damage rect. |
309 | 337 |
310 if (&m_paintLayer == localPaintingInfo.rootLayer && (localPaintFlags & Paint LayerPaintingOverflowContents)) | 338 if (&m_paintLayer == localPaintingInfo.rootLayer && (localPaintFlags & Paint LayerPaintingOverflowContents)) |
311 return true; | 339 return true; |
312 | 340 |
313 for (DeprecatedPaintLayerFragment& fragment: fragments) { | 341 for (DeprecatedPaintLayerFragment& fragment: fragments) { |
314 LayoutPoint newOffsetFromRoot = offsetFromRoot + fragment.paginationOffs et; | 342 LayoutPoint newOffsetFromRoot = offsetFromRoot + fragment.paginationOffs et; |
315 // Note that this really only works reliably on the first fragment. If t he layer has visible | 343 // Note that this really only works reliably on the first fragment. If t he layer has visible |
316 // overflow and a subsequent fragment doesn't intersect with the border box of the layer | 344 // overflow and a subsequent fragment doesn't intersect with the border box of the layer |
317 // (i.e. only contains an overflow portion of the layer), intersection w ill fail. The reason | 345 // (i.e. only contains an overflow portion of the layer), intersection w ill fail. The reason |
318 // for this is that fragment.layerBounds is set to the border box, not t he bounding box, of | 346 // for this is that fragment.layerBounds is set to the border box, not t he bounding box, of |
319 // the layer. | 347 // the layer. |
320 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac kgroundRect.rect(), localPaintingInfo.rootLayer, &newOffsetFromRoot)) | 348 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac kgroundRect.rect(), nullptr, &newOffsetFromRoot)) |
321 return true; | 349 return true; |
322 } | 350 } |
323 return false; | 351 return false; |
324 } | 352 } |
325 | 353 |
326 void DeprecatedPaintLayerPainter::paintLayerWithTransform(GraphicsContext* conte xt, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintF lags) | 354 void DeprecatedPaintLayerPainter::paintLayerWithTransform(GraphicsContext* conte xt, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintF lags) |
327 { | 355 { |
328 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint ingInfo.globalPaintFlags()); | 356 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint ingInfo.globalPaintFlags()); |
329 // If the transform can't be inverted, then don't paint anything. | 357 // If the transform can't be inverted, then don't paint anything. |
330 if (!layerTransform.isInvertible()) | 358 if (!layerTransform.isInvertible()) |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
408 | 436 |
409 void DeprecatedPaintLayerPainter::paintChildren(unsigned childrenToVisit, Graphi csContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintL ayerFlags paintFlags) | 437 void DeprecatedPaintLayerPainter::paintChildren(unsigned childrenToVisit, Graphi csContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintL ayerFlags paintFlags) |
410 { | 438 { |
411 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) | 439 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) |
412 return; | 440 return; |
413 | 441 |
414 #if ENABLE(ASSERT) | 442 #if ENABLE(ASSERT) |
415 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); | 443 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); |
416 #endif | 444 #endif |
417 | 445 |
446 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | |
447 paintChildrenV2(childrenToVisit, context, paintingInfo, paintFlags); | |
pdr.
2015/08/25 20:47:55
return here?
trchen
2015/08/26 07:39:04
Done.
| |
448 | |
418 IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation; | 449 IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation; |
419 if (m_paintLayer.layoutObject()->hasOverflowClip()) | 450 if (m_paintLayer.layoutObject()->hasOverflowClip()) |
420 scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOff set(); | 451 scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOff set(); |
421 | 452 |
422 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit); | 453 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit); |
423 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { | 454 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { |
424 DeprecatedPaintLayerPainter childPainter(*child->layer()); | 455 DeprecatedPaintLayerPainter childPainter(*child->layer()); |
425 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents() | 456 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents() |
426 // and CompositedDeprecatedPaintLayerMapping::doPaintTask(). | 457 // and CompositedDeprecatedPaintLayerMapping::doPaintTask(). |
427 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo.globalPain tFlags(), paintFlags)) | 458 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo.globalPain tFlags(), paintFlags)) |
428 continue; | 459 continue; |
429 | 460 |
430 DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo; | 461 DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo; |
431 childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation; | 462 childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation; |
432 // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer. | 463 // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer. |
433 for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); paren tLayer != &m_paintLayer; parentLayer = parentLayer->parent()) { | 464 for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); paren tLayer != &m_paintLayer; parentLayer = parentLayer->parent()) { |
434 if (parentLayer->layoutObject()->hasOverflowClip()) | 465 if (parentLayer->layoutObject()->hasOverflowClip()) |
435 childPaintingInfo.scrollOffsetAccumulation += parentLayer->layou tBox()->scrolledContentOffset(); | 466 childPaintingInfo.scrollOffsetAccumulation += parentLayer->layou tBox()->scrolledContentOffset(); |
436 } | 467 } |
437 | 468 |
438 childPainter.paintLayer(context, childPaintingInfo, paintFlags); | 469 childPainter.paintLayer(context, childPaintingInfo, paintFlags); |
439 } | 470 } |
440 } | 471 } |
441 | 472 |
473 static void recursivelyScrollAndPaintChildLayer(Vector<DeprecatedPaintLayer*>& c lippingAncestors, DeprecatedPaintLayer& child, GraphicsContext& context, const D eprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) | |
474 { | |
475 if (clippingAncestors.isEmpty()) { | |
476 DeprecatedPaintLayerPainter childPainter(child); | |
477 childPainter.paintLayer(&context, paintingInfo, paintFlags); | |
478 return; | |
479 } | |
480 DeprecatedPaintLayer* layer = clippingAncestors.last(); | |
481 clippingAncestors.removeLast(); | |
482 | |
483 // TODO(trchen): Add LayerClipRecorder here. | |
484 | |
485 IntSize scrollOffset = layer->layoutBox()->scrolledContentOffset(); | |
486 Optional<ScrollRecorder> scrollRecorder; | |
487 if (layer->scrollsOverflow() || !scrollOffset.isZero()) | |
488 scrollRecorder.emplace(context, *layer->layoutObject(), PaintPhaseBlockB ackground, scrollOffset); | |
489 recursivelyScrollAndPaintChildLayer(clippingAncestors, child, context, paint ingInfo, paintFlags); | |
490 } | |
491 | |
492 void DeprecatedPaintLayerPainter::paintChildrenV2(unsigned childrenToVisit, Grap hicsContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, Pain tLayerFlags paintFlags) | |
493 { | |
494 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit); | |
495 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { | |
496 EPosition childPosition = child->layer()->layoutObject()->style()->posit ion(); | |
497 if (childPosition == FixedPosition) { | |
498 // TODO(trchen): Refer to the transform/clip node of the nearest tra nsformed ancestor. | |
499 continue; | |
500 } | |
501 | |
502 Vector<DeprecatedPaintLayer*> clippingAncestors; | |
503 | |
504 // TODO(trchen): Needs to add referrals to reuse existing transform/clip nodes. | |
505 DeprecatedPaintLayer* currentLayer = child->layer(); | |
506 while (currentLayer && currentLayer != &m_paintLayer) { | |
507 EPosition position = currentLayer->layoutObject()->style()->position (); | |
508 ASSERT(position != FixedPosition); | |
509 | |
510 DeprecatedPaintLayer* container; | |
pdr.
2015/08/25 20:47:55
DeprecatedPaintLayer* container = nullptr;
(pointe
trchen
2015/08/26 07:39:04
Done.
| |
511 if (position == AbsolutePosition) { | |
512 bool ranPastThisLayer; | |
513 container = currentLayer->enclosingPositionedAncestor(&m_paintLa yer, &ranPastThisLayer); | |
514 if (ranPastThisLayer) | |
515 break; | |
516 } else { | |
517 container = currentLayer->parent(); | |
518 } | |
519 if (!container) | |
520 break; | |
521 | |
522 if (container->layoutObject()->hasOverflowClip()) | |
523 clippingAncestors.append(container); | |
524 | |
525 currentLayer = container; | |
526 } | |
527 | |
528 recursivelyScrollAndPaintChildLayer(clippingAncestors, *child->layer(), *context, paintingInfo, paintFlags); | |
529 } | |
530 } | |
531 | |
442 // FIXME: inline this. | 532 // FIXME: inline this. |
443 static bool paintForFixedRootBackground(const DeprecatedPaintLayer* layer, Paint LayerFlags paintFlags) | 533 static bool paintForFixedRootBackground(const DeprecatedPaintLayer* layer, Paint LayerFlags paintFlags) |
444 { | 534 { |
445 return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLaye rPaintingRootBackgroundOnly); | 535 return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLaye rPaintingRootBackgroundOnly); |
446 } | 536 } |
447 | 537 |
448 bool DeprecatedPaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPai ntFlags globalPaintFlags, PaintLayerFlags paintFlags) | 538 bool DeprecatedPaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPai ntFlags globalPaintFlags, PaintLayerFlags paintFlags) |
449 { | 539 { |
450 DisableCompositingQueryAsserts disabler; | 540 DisableCompositingQueryAsserts disabler; |
451 | 541 |
(...skipping 17 matching lines...) Expand all Loading... | |
469 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), Display Item::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fr agment.paginationOffset, paintFlags); | 559 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), Display Item::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fr agment.paginationOffset, paintFlags); |
470 if (DeprecatedPaintLayerScrollableArea* scrollableArea = m_paintLayer.sc rollableArea()) | 560 if (DeprecatedPaintLayerScrollableArea* scrollableArea = m_paintLayer.sc rollableArea()) |
471 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context , roundedIntPoint(toPoint(fragment.layerBounds.location() - m_paintLayer.layoutB oxLocation())), pixelSnappedIntRect(fragment.backgroundRect.rect()), true); | 561 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context , roundedIntPoint(toPoint(fragment.layerBounds.location() - m_paintLayer.layoutB oxLocation())), pixelSnappedIntRect(fragment.backgroundRect.rect()), true); |
472 } | 562 } |
473 } | 563 } |
474 | 564 |
475 void DeprecatedPaintLayerPainter::paintFragmentWithPhase(PaintPhase phase, const DeprecatedPaintLayerFragment& fragment, GraphicsContext* context, const ClipRec t& clipRect, const DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags, ClipState clipState) | 565 void DeprecatedPaintLayerPainter::paintFragmentWithPhase(PaintPhase phase, const DeprecatedPaintLayerFragment& fragment, GraphicsContext* context, const ClipRec t& clipRect, const DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags, ClipState clipState) |
476 { | 566 { |
477 ASSERT(m_paintLayer.isSelfPaintingLayer()); | 567 ASSERT(m_paintLayer.isSelfPaintingLayer()); |
478 | 568 |
569 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | |
570 PaintInfo paintInfo(context, enclosingIntRect(paintingInfo.paintDirtyRec t), phase, paintingInfo.globalPaintFlags(), paintFlags, paintingRootForLayoutObj ect, 0, paintingInfo.rootLayer->layoutObject()); | |
571 LayoutPoint paintOffset = toPoint(fragment.layerBounds.location() - m_pa intLayer.layoutBoxLocation()); | |
572 m_paintLayer.layoutObject()->paint(paintInfo, paintOffset); | |
573 return; | |
574 } | |
575 | |
479 Optional<LayerClipRecorder> clipRecorder; | 576 Optional<LayerClipRecorder> clipRecorder; |
480 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p aintingInfo, clipRect)) { | 577 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p aintingInfo, clipRect)) { |
481 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT ype(phase); | 578 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT ype(phase); |
482 LayerClipRecorder::BorderRadiusClippingRule clippingRule; | 579 LayerClipRecorder::BorderRadiusClippingRule clippingRule; |
483 switch (phase) { | 580 switch (phase) { |
484 case PaintPhaseBlockBackground: // Background painting will handle clipp ing to self. | 581 case PaintPhaseBlockBackground: // Background painting will handle clipp ing to self. |
485 case PaintPhaseSelfOutline: | 582 case PaintPhaseSelfOutline: |
486 case PaintPhaseMask: // Mask painting will handle clipping to self. | 583 case PaintPhaseMask: // Mask painting will handle clipping to self. |
487 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; | 584 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; |
488 break; | 585 break; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
604 if (!m_paintLayer.containsDirtyOverlayScrollbars()) | 701 if (!m_paintLayer.containsDirtyOverlayScrollbars()) |
605 return; | 702 return; |
606 | 703 |
607 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot); | 704 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot); |
608 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); | 705 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); |
609 | 706 |
610 m_paintLayer.setContainsDirtyOverlayScrollbars(false); | 707 m_paintLayer.setContainsDirtyOverlayScrollbars(false); |
611 } | 708 } |
612 | 709 |
613 } // namespace blink | 710 } // namespace blink |
OLD | NEW |