Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: Source/core/paint/DeprecatedPaintLayerPainter.cpp

Issue 1284203004: Generate scroll/clip display item hierarchy for SPv2 (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix failing test. Update test expectation. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
11 #include "core/layout/LayoutView.h" 11 #include "core/layout/LayoutView.h"
12 #include "core/layout/svg/LayoutSVGResourceClipper.h" 12 #include "core/layout/svg/LayoutSVGResourceClipper.h"
13 #include "core/page/Page.h" 13 #include "core/page/Page.h"
14 #include "core/paint/CompositingRecorder.h" 14 #include "core/paint/CompositingRecorder.h"
15 #include "core/paint/DeprecatedPaintLayer.h" 15 #include "core/paint/DeprecatedPaintLayer.h"
16 #include "core/paint/FilterPainter.h" 16 #include "core/paint/FilterPainter.h"
17 #include "core/paint/LayerClipRecorder.h" 17 #include "core/paint/LayerClipRecorder.h"
18 #include "core/paint/LayerFixedPositionRecorder.h" 18 #include "core/paint/LayerFixedPositionRecorder.h"
19 #include "core/paint/PaintInfo.h" 19 #include "core/paint/PaintInfo.h"
20 #include "core/paint/SVGClipPainter.h" 20 #include "core/paint/SVGClipPainter.h"
21 #include "core/paint/ScopeRecorder.h" 21 #include "core/paint/ScopeRecorder.h"
22 #include "core/paint/ScrollRecorder.h" 22 #include "core/paint/ScrollRecorder.h"
23 #include "core/paint/ScrollableAreaPainter.h" 23 #include "core/paint/ScrollableAreaPainter.h"
24 #include "core/paint/Transform3DRecorder.h" 24 #include "core/paint/Transform3DRecorder.h"
25 #include "core/paint/TransformRecorder.h"
25 #include "platform/graphics/GraphicsLayer.h" 26 #include "platform/graphics/GraphicsLayer.h"
26 #include "platform/graphics/paint/ClipPathRecorder.h" 27 #include "platform/graphics/paint/ClipPathRecorder.h"
27 #include "platform/graphics/paint/ClipRecorder.h" 28 #include "platform/graphics/paint/ClipRecorder.h"
28 #include "platform/graphics/paint/CompositingDisplayItem.h" 29 #include "platform/graphics/paint/CompositingDisplayItem.h"
30 #include "platform/graphics/paint/FixedPositionContainerDisplayItem.h"
29 #include "platform/graphics/paint/SubsequenceRecorder.h" 31 #include "platform/graphics/paint/SubsequenceRecorder.h"
30 #include "platform/graphics/paint/Transform3DDisplayItem.h" 32 #include "platform/graphics/paint/Transform3DDisplayItem.h"
31 #include "wtf/Optional.h" 33 #include "wtf/Optional.h"
32 34
33 namespace blink { 35 namespace blink {
34 36
35 static inline bool shouldSuppressPaintingLayer(DeprecatedPaintLayer* layer) 37 static inline bool shouldSuppressPaintingLayer(DeprecatedPaintLayer* layer)
36 { 38 {
37 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC. 39 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC.
38 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document 40 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 if (!m_paintLayer.layoutObject()->opacity() && !m_paintLayer.layoutObject()- >hasBackdropFilter()) 86 if (!m_paintLayer.layoutObject()->opacity() && !m_paintLayer.layoutObject()- >hasBackdropFilter())
85 return; 87 return;
86 88
87 if (!needsRepaint && SubsequenceRecorder::useCachedSubsequenceIfPossible(*co ntext, *m_paintLayer.layoutObject())) 89 if (!needsRepaint && SubsequenceRecorder::useCachedSubsequenceIfPossible(*co ntext, *m_paintLayer.layoutObject()))
88 return; 90 return;
89 SubsequenceRecorder subsequenceRecorder(*context, *m_paintLayer.layoutObject ()); 91 SubsequenceRecorder subsequenceRecorder(*context, *m_paintLayer.layoutObject ());
90 92
91 if (m_paintLayer.paintsWithTransparency(paintingInfo.globalPaintFlags())) 93 if (m_paintLayer.paintsWithTransparency(paintingInfo.globalPaintFlags()))
92 paintFlags |= PaintLayerHaveTransparency; 94 paintFlags |= PaintLayerHaveTransparency;
93 95
94 LayerFixedPositionRecorder fixedPositionRecorder(*context, *m_paintLayer.lay outObject());
95
96 // PaintLayerAppliedTransform is used in LayoutReplica, to avoid applying th e transform twice. 96 // PaintLayerAppliedTransform is used in LayoutReplica, to avoid applying th e transform twice.
97 if (m_paintLayer.paintsWithTransform(paintingInfo.globalPaintFlags()) && !(p aintFlags & PaintLayerAppliedTransform)) { 97 if (m_paintLayer.paintsWithTransform(paintingInfo.globalPaintFlags()) && !(p aintFlags & PaintLayerAppliedTransform)) {
98 paintLayerWithTransform(context, paintingInfo, paintFlags); 98 paintLayerWithTransform(context, paintingInfo, paintFlags);
99 return; 99 return;
100 } 100 }
101 101
102 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); 102 paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
103 } 103 }
104 104
105 void DeprecatedPaintLayerPainter::paintLayerContentsAndReflection(GraphicsContex t* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlag s paintFlags, FragmentPolicy fragmentPolicy) 105 void DeprecatedPaintLayerPainter::paintLayerContentsAndReflection(GraphicsContex t* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlag s 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 // Paint the reflection first if we have one. 111 // Paint the reflection first if we have one.
112 if (m_paintLayer.reflectionInfo()) { 112 if (m_paintLayer.reflectionInfo()) {
113 ScopeRecorder scopeRecorder(*context); 113 ScopeRecorder scopeRecorder(*context);
114 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl ags | PaintLayerPaintingReflection); 114 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl ags | PaintLayerPaintingReflection);
115 } 115 }
116 116
117 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; 117 localPaintFlags |= PaintLayerPaintingCompositingAllPhases;
118 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy); 118 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy);
119 } 119 }
120 120
121 class ClipPathHelper { 121 class ClipPathHelper {
122 public: 122 public:
123 ClipPathHelper(GraphicsContext* context, const DeprecatedPaintLayer& paintLa yer, const DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutRect& rootRelat iveBounds, bool& rootRelativeBoundsComputed, 123 ClipPathHelper(GraphicsContext* context, const DeprecatedPaintLayer& paintLa yer, const LayoutRect& interestRect, LayoutRect& rootRelativeBounds, bool& rootR elativeBoundsComputed,
124 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) 124 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags)
125 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) 125 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context)
126 { 126 {
127 const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); 127 const ComputedStyle& style = paintLayer.layoutObject()->styleRef();
128 128
129 // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container. 129 // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container.
130 // It must, however, still be applied to the mask layer, so that the com positor can properly mask the 130 // It must, however, still be applied to the mask layer, so that the com positor can properly mask the
131 // scrolling contents and scrollbars. 131 // scrolling contents and scrollbars.
132 if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompos itedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) 132 if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompos itedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase)))
133 return; 133 return;
134 134
135 m_clipperState = SVGClipPainter::ClipperNotApplied; 135 m_clipperState = SVGClipPainter::ClipperNotApplied;
136 136
137 ASSERT(style.clipPath()); 137 ASSERT(style.clipPath());
138 if (style.clipPath()->type() == ClipPathOperation::SHAPE) { 138 if (style.clipPath()->type() == ClipPathOperation::SHAPE) {
139 ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.cl ipPath()); 139 ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.cl ipPath());
140 if (clipPath->isValid()) { 140 if (clipPath->isValid()) {
141 if (!rootRelativeBoundsComputed) { 141 if (!rootRelativeBoundsComputed) {
142 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot); 142 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(offsetFromRoot);
143 rootRelativeBoundsComputed = true; 143 rootRelativeBoundsComputed = true;
144 } 144 }
145 m_clipPathRecorder.emplace(*context, *paintLayer.layoutObject(), clipPath->path(FloatRect(rootRelativeBounds))); 145 m_clipPathRecorder.emplace(*context, *paintLayer.layoutObject(), clipPath->path(FloatRect(rootRelativeBounds)));
146 } 146 }
147 } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) { 147 } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) {
148 ReferenceClipPathOperation* referenceClipPathOperation = toReference ClipPathOperation(style.clipPath()); 148 ReferenceClipPathOperation* referenceClipPathOperation = toReference ClipPathOperation(style.clipPath());
149 Document& document = paintLayer.layoutObject()->document(); 149 Document& document = paintLayer.layoutObject()->document();
150 // FIXME: It doesn't work with forward or external SVG references (h ttps://bugs.webkit.org/show_bug.cgi?id=90405) 150 // FIXME: It doesn't work with forward or external SVG references (h ttps://bugs.webkit.org/show_bug.cgi?id=90405)
151 Element* element = document.getElementById(referenceClipPathOperatio n->fragment()); 151 Element* element = document.getElementById(referenceClipPathOperatio n->fragment());
152 if (isSVGClipPathElement(element) && element->layoutObject()) { 152 if (isSVGClipPathElement(element) && element->layoutObject()) {
153 if (!rootRelativeBoundsComputed) { 153 if (!rootRelativeBoundsComputed) {
154 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot); 154 rootRelativeBounds = paintLayer.physicalBoundingBoxIncluding ReflectionAndStackingChildren(offsetFromRoot);
155 rootRelativeBoundsComputed = true; 155 rootRelativeBoundsComputed = true;
156 } 156 }
157 157
158 m_resourceClipper = toLayoutSVGResourceClipper(toLayoutSVGResour ceContainer(element->layoutObject())); 158 m_resourceClipper = toLayoutSVGResourceClipper(toLayoutSVGResour ceContainer(element->layoutObject()));
159 if (!SVGClipPainter(*m_resourceClipper).prepareEffect(*paintLaye r.layoutObject(), FloatRect(rootRelativeBounds), 159 if (!SVGClipPainter(*m_resourceClipper).prepareEffect(*paintLaye r.layoutObject(), FloatRect(rootRelativeBounds),
160 FloatRect(paintingInfo.paintDirtyRect), context, m_clipperSt ate)) { 160 FloatRect(interestRect), context, m_clipperState)) {
161 // No need to post-apply the clipper if this failed. 161 // No need to post-apply the clipper if this failed.
162 m_resourceClipper = 0; 162 m_resourceClipper = 0;
163 } 163 }
164 } 164 }
165 } 165 }
166 } 166 }
167 167
168 ~ClipPathHelper() 168 ~ClipPathHelper()
169 { 169 {
170 if (m_resourceClipper) 170 if (m_resourceClipper)
(...skipping 28 matching lines...) Expand all
199 && ((isPaintingScrollingContent && isPaintingCompositedBackground) 199 && ((isPaintingScrollingContent && isPaintingCompositedBackground)
200 || (!isPaintingScrollingContent && isPaintingCompositedForeground)); 200 || (!isPaintingScrollingContent && isPaintingCompositedForeground));
201 bool shouldPaintContent = m_paintLayer.hasVisibleContent() && isSelfPainting Layer && !isPaintingOverlayScrollbars; 201 bool shouldPaintContent = m_paintLayer.hasVisibleContent() && isSelfPainting Layer && !isPaintingOverlayScrollbars;
202 202
203 if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layou tObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement()) 203 if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layou tObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement())
204 return; 204 return;
205 205
206 // Ensure our lists are up-to-date. 206 // Ensure our lists are up-to-date.
207 m_paintLayer.stackingNode()->updateLayerListsIfNeeded(); 207 m_paintLayer.stackingNode()->updateLayerListsIfNeeded();
208 208
209 LayoutPoint offsetFromRoot; 209 LayoutPoint offsetFromRoot = toLayoutPoint(paintingInfo.subPixelAccumulation );
210 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); 210 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
211 211 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot , DeprecatedPaintLayer::ExcludeScroll);
212 if (m_paintLayer.compositingState() == PaintsIntoOwnBacking)
213 offsetFromRoot.move(m_paintLayer.subpixelAccumulation());
214 else 212 else
215 offsetFromRoot.move(paintingInfo.subPixelAccumulation); 213 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot );
216 214
217 LayoutRect rootRelativeBounds; 215 LayoutRect rootRelativeBounds;
218 bool rootRelativeBoundsComputed = false; 216 bool rootRelativeBoundsComputed = false;
219 217
218 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && !context->displayIte mList()->displayItemConstructionIsDisabled()) {
219 if (paintingInfo.rootLayer == &m_paintLayer) {
220 // A counter scroll needs to be applied in non-rootLayerScrolls mode ,
pdr. 2015/09/03 06:16:59 Can you add a test for this?
trchen 2015/09/04 06:10:15 I think it is a bit too early. This is only a work
221 // because we are supposed to paint in absolute space.
222 // (i.e. Impl-side scrolling would be impossible.)
223 // With rootLayerScrolls enabled, we are in the viewport space inste ad.
224 AffineTransform counterScroll;
225 if (m_paintLayer.layoutObject()->isLayoutView()) {
226 Settings* settings = m_paintLayer.layoutObject()->document().set tings();
227 if (settings && settings->rootLayerScrolls()) {
228 IntSize scrollOffset = static_cast<LayoutView*>(m_paintLayer .layoutObject())->frameView()->scrollOffset();
229 counterScroll.translate(scrollOffset.width(), scrollOffset.h eight());
230 }
231 }
232 TransformRecorder frameScrollWorkaround(*context, *m_paintLayer.layo utObject(), counterScroll);
233
234 context->displayItemList()->createAndAppend<FixedPositionContainerDi splayItem>(*m_paintLayer.layoutObject());
235 }
236 }
237
220 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction, 238 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction,
221 // so they are nested properly. 239 // so they are nested properly.
222 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelat iveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); 240 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo.paintDirty Rect, rootRelativeBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags );
223 241
224 Optional<CompositingRecorder> compositingRecorder; 242 Optional<CompositingRecorder> compositingRecorder;
225 // Blending operations must be performed only with the nearest ancestor stac king context. 243 // Blending operations must be performed only with the nearest ancestor stac king context.
226 // Note that there is no need to composite if we're painting the root. 244 // Note that there is no need to composite if we're painting the root.
227 // FIXME: this should be unified further into DeprecatedPaintLayer::paintsWi thTransparency(). 245 // FIXME: this should be unified further into DeprecatedPaintLayer::paintsWi thTransparency().
228 bool shouldCompositeForBlendMode = (!m_paintLayer.layoutObject()->isDocument Element() || m_paintLayer.layoutObject()->isSVGRoot()) && m_paintLayer.stackingN ode()->isStackingContext() && m_paintLayer.hasNonIsolatedDescendantWithBlendMode (); 246 bool shouldCompositeForBlendMode = (!m_paintLayer.layoutObject()->isDocument Element() || m_paintLayer.layoutObject()->isSVGRoot()) && m_paintLayer.stackingN ode()->isStackingContext() && m_paintLayer.hasNonIsolatedDescendantWithBlendMode ();
229 if (shouldCompositeForBlendMode || m_paintLayer.paintsWithTransparency(paint ingInfo.globalPaintFlags())) { 247 if (shouldCompositeForBlendMode || m_paintLayer.paintsWithTransparency(paint ingInfo.globalPaintFlags())) {
230 FloatRect compositingBounds = FloatRect(m_paintLayer.paintingExtent(pain tingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.globalPaintFlags() )); 248 FloatRect compositingBounds = FloatRect(m_paintLayer.paintingExtent(pain tingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.globalPaintFlags() ));
231 compositingRecorder.emplace(*context, *m_paintLayer.layoutObject(), 249 compositingRecorder.emplace(*context, *m_paintLayer.layoutObject(),
232 WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_paintLayer.la youtObject()->style()->blendMode()), 250 WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_paintLayer.la youtObject()->style()->blendMode()),
233 m_paintLayer.layoutObject()->opacity(), &compositingBounds); 251 m_paintLayer.layoutObject()->opacity(), &compositingBounds);
234 } 252 }
235 253
236 DeprecatedPaintLayerPaintingInfo localPaintingInfo(paintingInfo);
237 if (m_paintLayer.compositingState() == PaintsIntoOwnBacking)
238 localPaintingInfo.subPixelAccumulation = m_paintLayer.subpixelAccumulati on();
239
240 DeprecatedPaintLayerFragments layerFragments; 254 DeprecatedPaintLayerFragments layerFragments;
241 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) { 255 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) {
242 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment. 256 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment.
243 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects; 257 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects;
244 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_paintLayer.layoutObject()); 258 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_paintLayer.layoutObject());
245 if (fragmentPolicy == ForceSingleFragment) 259 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
246 m_paintLayer.appendSingleFragmentIgnoringPagination(layerFragments, localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect, cacheSlot, Ignore OverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.su bPixelAccumulation); 260 // TODO(trchen): Need to handle layer fragmentation.
247 else 261 DeprecatedPaintLayerFragment fragment;
248 m_paintLayer.collectFragments(layerFragments, localPaintingInfo.root Layer, localPaintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.subPixelAccumulation); 262 fragment.layerBounds = LayoutRect(offsetFromRoot, LayoutSize(m_paint Layer.size()));
263 fragment.backgroundRect = LayoutRect::infiniteRect();
264 fragment.foregroundRect = LayoutRect::infiniteRect();
265 fragment.outlineRect = LayoutRect::infiniteRect();
266 layerFragments.append(fragment);
267 } else if (fragmentPolicy == ForceSingleFragment) {
268 m_paintLayer.appendSingleFragmentIgnoringPagination(layerFragments, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScr ollbarSize, respectOverflowClip, &offsetFromRoot, paintingInfo.subPixelAccumulat ion);
269 } else {
270 m_paintLayer.collectFragments(layerFragments, paintingInfo.rootLayer , paintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOve rflowClip, &offsetFromRoot, paintingInfo.subPixelAccumulation);
271 }
272
249 if (shouldPaintContent) 273 if (shouldPaintContent)
250 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, localPaintingInfo, paintFlags, offsetFromRoot); 274 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, paintingInfo, paintFlags, offsetFromRoot);
251 } 275 }
252 276
253 bool selectionOnly = localPaintingInfo.globalPaintFlags() & GlobalPaintSelec tionOnly; 277 bool selectionOnly = paintingInfo.globalPaintFlags() & GlobalPaintSelectionO nly;
254 // If this layer's layoutObject is a child of the paintingRoot, we paint unc onditionally, which 278 // If this layer's layoutObject is a child of the paintingRoot, we paint unc onditionally, which
255 // is done by passing a nil paintingRoot down to our layoutObject (as if no paintingRoot was ever set). 279 // is done by passing a nil paintingRoot down to our layoutObject (as if no paintingRoot was ever set).
256 // Else, our layout tree may or may not contain the painting root, so we pas s that root along 280 // Else, our layout tree may or may not contain the painting root, so we pas s that root along
257 // so it will be tested against as we descend through the layoutObjects. 281 // so it will be tested against as we descend through the layoutObjects.
258 LayoutObject* paintingRootForLayoutObject = 0; 282 LayoutObject* paintingRootForLayoutObject = 0;
259 if (localPaintingInfo.paintingRoot && !m_paintLayer.layoutObject()->isDescen dantOf(localPaintingInfo.paintingRoot)) 283 if (paintingInfo.paintingRoot && !m_paintLayer.layoutObject()->isDescendantO f(paintingInfo.paintingRoot))
260 paintingRootForLayoutObject = localPaintingInfo.paintingRoot; 284 paintingRootForLayoutObject = paintingInfo.paintingRoot;
261 285
262 { // Begin block for the lifetime of any filter. 286 { // Begin block for the lifetime of any filter.
263 FilterPainter filterPainter(m_paintLayer, context, offsetFromRoot, layer Fragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect, localPainti ngInfo, paintFlags, 287 // FilterRecorder may mutate paintingInfo.
pdr. 2015/09/03 06:16:59 FilterRecorder -> FilterPainter, but I agree about
trchen 2015/09/04 06:10:14 Revert done.
288 DeprecatedPaintLayerPaintingInfo localPaintingInfo(paintingInfo);
289 localPaintingInfo.clipToDirtyRect = true;
290 ClipRect compositingBound;
291 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
trchen 2015/09/02 22:55:37 This change is unnecessary at this moment. Probabl
292 // Similar to transparency clip above, for SPv2 the compositing boun d is only
293 // known since layerization and impl-side animation has been applied .
294 compositingBound = localPaintingInfo.paintDirtyRect;
295 } else if (!layerFragments.isEmpty()) {
296 // TODO(trchen): Using layerFragments[0].backgroundRect as compositi ng bound is
297 // incorrect. Using the union of the fragment clip rects could be a workaround
298 // but is still wrong in operation order. Conceptually it should be equivalent
299 // as painting the filtered stacking context as a whole, then cut th e results into
300 // fragments for pasting.
301 compositingBound = layerFragments[0].backgroundRect;
302 }
303 FilterPainter filterPainter(m_paintLayer, context, offsetFromRoot, compo sitingBound, localPaintingInfo, paintFlags,
264 rootRelativeBounds, rootRelativeBoundsComputed); 304 rootRelativeBounds, rootRelativeBoundsComputed);
265 305
266 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly; 306 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly;
267 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound); 307 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound);
268 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent; 308 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent;
269 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound; 309 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound;
270 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; 310 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars;
271 311
272 if (shouldPaintBackground) { 312 if (shouldPaintBackground) {
273 paintBackgroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, 313 paintBackgroundForFragments(layerFragments, context, localPaintingIn fo.paintDirtyRect,
274 localPaintingInfo, paintingRootForLayoutObject, paintFlags); 314 localPaintingInfo, paintingRootForLayoutObject, paintFlags);
275 } 315 }
276 316
277 if (shouldPaintNegZOrderList) 317 if (shouldPaintNegZOrderList)
278 paintChildren(NegativeZOrderChildren, context, paintingInfo, paintFl ags); 318 paintChildren(NegativeZOrderChildren, context, localPaintingInfo, pa intFlags);
279 319
280 if (shouldPaintOwnContents) { 320 if (shouldPaintOwnContents) {
281 paintForegroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, 321 paintForegroundForFragments(layerFragments, context, localPaintingIn fo.paintDirtyRect,
282 localPaintingInfo, paintingRootForLayoutObject, selectionOnly, p aintFlags); 322 localPaintingInfo, paintingRootForLayoutObject, selectionOnly, p aintFlags);
283 } 323 }
284 324
285 if (shouldPaintOutline) 325 if (shouldPaintOutline)
286 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags); 326 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags);
287 327
288 if (shouldPaintNormalFlowAndPosZOrderLists) 328 if (shouldPaintNormalFlowAndPosZOrderLists)
289 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, paintingInfo, paintFlags); 329 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, localPaintingInfo, paintFlags);
290 330
291 if (shouldPaintOverlayScrollbars) 331 if (shouldPaintOverlayScrollbars)
292 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags); 332 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags);
293 } // FilterPainter block 333 } // FilterPainter block
294 334
295 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn ly; 335 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn ly;
296 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly; 336 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly;
297 337
298 if (shouldPaintMask) 338 if (shouldPaintMask)
299 paintMaskForFragments(layerFragments, context, localPaintingInfo, painti ngRootForLayoutObject, paintFlags); 339 paintMaskForFragments(layerFragments, context, paintingInfo, paintingRoo tForLayoutObject, paintFlags);
300 if (shouldPaintClippingMask) { 340 if (shouldPaintClippingMask) {
301 // Paint the border radius mask for the fragments. 341 // Paint the border radius mask for the fragments.
302 paintChildClippingMaskForFragments(layerFragments, context, localPaintin gInfo, paintingRootForLayoutObject, paintFlags); 342 paintChildClippingMaskForFragments(layerFragments, context, paintingInfo , paintingRootForLayoutObject, paintFlags);
303 } 343 }
304 } 344 }
305 345
306 bool DeprecatedPaintLayerPainter::needsToClip(const DeprecatedPaintLayerPainting Info& localPaintingInfo, const ClipRect& clipRect) 346 bool DeprecatedPaintLayerPainter::needsToClip(const DeprecatedPaintLayerPainting Info& localPaintingInfo, const ClipRect& clipRect)
307 { 347 {
348 // With SPv2 a layer clips its descendants so a layer never clips itself.
349 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
350 return false;
308 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius(); 351 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius();
309 } 352 }
310 353
311 bool DeprecatedPaintLayerPainter::atLeastOneFragmentIntersectsDamageRect(Depreca tedPaintLayerFragments& fragments, const DeprecatedPaintLayerPaintingInfo& local PaintingInfo, PaintLayerFlags localPaintFlags, const LayoutPoint& offsetFromRoot ) 354 bool DeprecatedPaintLayerPainter::atLeastOneFragmentIntersectsDamageRect(Depreca tedPaintLayerFragments& fragments, const DeprecatedPaintLayerPaintingInfo& local PaintingInfo, PaintLayerFlags localPaintFlags, const LayoutPoint& offsetFromRoot )
312 { 355 {
313 if (m_paintLayer.enclosingPaginationLayer()) 356 if (m_paintLayer.enclosingPaginationLayer())
314 return true; // The fragments created have already been found to interse ct with the damage rect. 357 return true; // The fragments created have already been found to interse ct with the damage rect.
315 358
316 if (&m_paintLayer == localPaintingInfo.rootLayer && (localPaintFlags & Paint LayerPaintingOverflowContents)) 359 if (&m_paintLayer == localPaintingInfo.rootLayer && (localPaintFlags & Paint LayerPaintingOverflowContents))
317 return true; 360 return true;
318 361
319 for (DeprecatedPaintLayerFragment& fragment: fragments) { 362 for (DeprecatedPaintLayerFragment& fragment: fragments) {
320 LayoutPoint newOffsetFromRoot = offsetFromRoot + fragment.paginationOffs et; 363 LayoutPoint newOffsetFromRoot = offsetFromRoot + fragment.paginationOffs et;
321 // Note that this really only works reliably on the first fragment. If t he layer has visible 364 // Note that this really only works reliably on the first fragment. If t he layer has visible
322 // overflow and a subsequent fragment doesn't intersect with the border box of the layer 365 // overflow and a subsequent fragment doesn't intersect with the border box of the layer
323 // (i.e. only contains an overflow portion of the layer), intersection w ill fail. The reason 366 // (i.e. only contains an overflow portion of the layer), intersection w ill fail. The reason
324 // for this is that fragment.layerBounds is set to the border box, not t he bounding box, of 367 // for this is that fragment.layerBounds is set to the border box, not t he bounding box, of
325 // the layer. 368 // the layer.
326 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac kgroundRect.rect(), localPaintingInfo.rootLayer, &newOffsetFromRoot)) 369 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac kgroundRect.rect(), nullptr, &newOffsetFromRoot))
327 return true; 370 return true;
328 } 371 }
329 return false; 372 return false;
330 } 373 }
331 374
332 void DeprecatedPaintLayerPainter::paintLayerWithTransform(GraphicsContext* conte xt, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintF lags) 375 void DeprecatedPaintLayerPainter::paintLayerWithTransform(GraphicsContext* conte xt, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintF lags)
333 { 376 {
334 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint ingInfo.globalPaintFlags()); 377 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint ingInfo.globalPaintFlags());
335 // If the transform can't be inverted, then don't paint anything. 378 // If the transform can't be inverted, then don't paint anything.
336 if (!layerTransform.isInvertible()) 379 if (!layerTransform.isInvertible())
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 457
415 void DeprecatedPaintLayerPainter::paintChildren(unsigned childrenToVisit, Graphi csContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintL ayerFlags paintFlags) 458 void DeprecatedPaintLayerPainter::paintChildren(unsigned childrenToVisit, Graphi csContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintL ayerFlags paintFlags)
416 { 459 {
417 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) 460 if (!m_paintLayer.hasSelfPaintingLayerDescendant())
418 return; 461 return;
419 462
420 #if ENABLE(ASSERT) 463 #if ENABLE(ASSERT)
421 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); 464 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode());
422 #endif 465 #endif
423 466
467 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
468 paintChildrenWithFullScrollClipChain(childrenToVisit, context, paintingI nfo, paintFlags);
469 return;
470 }
471
424 IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation; 472 IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation;
425 if (m_paintLayer.layoutObject()->hasOverflowClip()) 473 if (m_paintLayer.layoutObject()->hasOverflowClip())
426 scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOff set(); 474 scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOff set();
427 475
428 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit); 476 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit);
429 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { 477 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) {
430 DeprecatedPaintLayerPainter childPainter(*child->layer()); 478 DeprecatedPaintLayerPainter childPainter(*child->layer());
431 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents() 479 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents()
432 // and CompositedDeprecatedPaintLayerMapping::doPaintTask(). 480 // and CompositedDeprecatedPaintLayerMapping::doPaintTask().
433 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo.globalPain tFlags(), paintFlags)) 481 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo.globalPain tFlags(), paintFlags))
434 continue; 482 continue;
435 483
436 DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo; 484 DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo;
437 childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation; 485 childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation;
438 // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer. 486 // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer.
439 for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); paren tLayer != &m_paintLayer; parentLayer = parentLayer->parent()) { 487 for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); paren tLayer != &m_paintLayer; parentLayer = parentLayer->parent()) {
440 if (parentLayer->layoutObject()->hasOverflowClip()) 488 if (parentLayer->layoutObject()->hasOverflowClip())
441 childPaintingInfo.scrollOffsetAccumulation += parentLayer->layou tBox()->scrolledContentOffset(); 489 childPaintingInfo.scrollOffsetAccumulation += parentLayer->layou tBox()->scrolledContentOffset();
442 } 490 }
443 491
444 childPainter.paintLayer(context, childPaintingInfo, paintFlags); 492 childPainter.paintLayer(context, childPaintingInfo, paintFlags);
445 } 493 }
446 } 494 }
447 495
496 static void recursivelyScrollAndPaintChildLayer(Vector<DeprecatedPaintLayer*>& c lippingAncestors, DeprecatedPaintLayer& child, GraphicsContext& context, const D eprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
497 {
pdr. 2015/09/03 06:16:59 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enab
trchen 2015/09/04 06:10:15 Done.
498 if (clippingAncestors.isEmpty()) {
499 DeprecatedPaintLayerPainter(child).paintLayer(&context, paintingInfo, pa intFlags);
500 return;
501 }
502 DeprecatedPaintLayer* layer = clippingAncestors.last();
503 clippingAncestors.removeLast();
504
505 ASSERT(layer->layoutObject()->hasOverflowClip() && layer->layoutObject()->is Box());
506 LayoutPoint paintOffset = toLayoutPoint(paintingInfo.subPixelAccumulation);
507 // TODO(trchen): Hey this is slow. We should be able to calculate this on tr aversal.
508 layer->convertToLayerCoords(paintingInfo.rootLayer, paintOffset, DeprecatedP aintLayer::ExcludeScroll);
509 LayerClipRecorder clipRecorder(context, *layer->layoutBox(), paintOffset);
510
511 IntSize scrollOffset = layer->layoutBox()->scrolledContentOffset();
pdr. 2015/09/03 06:16:59 Don't we need to emit a scroll recorder even if th
trchen 2015/09/04 06:10:15 Isn't it the first clause on line 513?
512 Optional<ScrollRecorder> scrollRecorder;
513 if (layer->scrollsOverflow() || !scrollOffset.isZero())
514 scrollRecorder.emplace(context, *layer->layoutObject(), PaintPhaseBlockB ackground, scrollOffset);
515 recursivelyScrollAndPaintChildLayer(clippingAncestors, child, context, paint ingInfo, paintFlags);
516 }
517
518 // TODO(trchen): Measure performance of this and implement display item de-dupin g if needed.
519 // For the pessimistic case this function will generate O(n^2) of clip/scroll pa irs, for example:
520 // <div style="overflow:scroll;"> * repeat 100 times
521 // <div style="position:relative;"></div> * repeat 100 times
522 // We will need to generate 100 clip/scroll pairs for each of the in-flow positi oned children.
523 void DeprecatedPaintLayerPainter::paintChildrenWithFullScrollClipChain(unsigned childrenToVisit, GraphicsContext* context, const DeprecatedPaintLayerPaintingInf o& paintingInfo, PaintLayerFlags paintFlags)
524 {
525 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
526
527 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit);
528 while (DeprecatedPaintLayerStackingNode* childNode = iterator.next()) {
529 DeprecatedPaintLayer* child = childNode->layer();
530 EPosition childPosition = child->layoutObject()->style()->position();
531 if (childPosition == FixedPosition) {
532 ASSERT(paintingInfo.rootLayer == child->enclosingPositionedAncestor( ));
533 // TODO(trchen): Handle the insanity with reflection + fixed positio n.
534 LayerFixedPositionRecorder fixedPositionRecorder(*context, *child->l ayoutObject(), *paintingInfo.rootLayer->layoutObject());
535 DeprecatedPaintLayerPainter(*child).paintLayer(context, paintingInfo , paintFlags);
536 continue;
537 }
538
539 Vector<DeprecatedPaintLayer*> clippingAncestors;
540 DeprecatedPaintLayer* currentLayer = child;
541 while (currentLayer && currentLayer != &m_paintLayer) {
542 EPosition position = currentLayer->layoutObject()->style()->position ();
543 ASSERT(position != FixedPosition);
544
545 DeprecatedPaintLayer* container = nullptr;
546 if (position == AbsolutePosition) {
547 bool ranPastThisLayer;
548 container = currentLayer->enclosingPositionedAncestor(&m_paintLa yer, &ranPastThisLayer);
549 if (ranPastThisLayer)
550 break;
551 } else {
552 container = currentLayer->parent();
553 }
554 if (!container)
555 break;
556
557 if (container->layoutObject()->hasOverflowClip())
558 clippingAncestors.append(container);
559
560 currentLayer = container;
561 }
562
563 recursivelyScrollAndPaintChildLayer(clippingAncestors, *child, *context, paintingInfo, paintFlags);
564 }
565 }
566
448 // FIXME: inline this. 567 // FIXME: inline this.
449 static bool paintForFixedRootBackground(const DeprecatedPaintLayer* layer, Paint LayerFlags paintFlags) 568 static bool paintForFixedRootBackground(const DeprecatedPaintLayer* layer, Paint LayerFlags paintFlags)
450 { 569 {
451 return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLaye rPaintingRootBackgroundOnly); 570 return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLaye rPaintingRootBackgroundOnly);
452 } 571 }
453 572
454 bool DeprecatedPaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPai ntFlags globalPaintFlags, PaintLayerFlags paintFlags) 573 bool DeprecatedPaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPai ntFlags globalPaintFlags, PaintLayerFlags paintFlags)
455 { 574 {
456 DisableCompositingQueryAsserts disabler; 575 DisableCompositingQueryAsserts disabler;
457 576
(...skipping 17 matching lines...) Expand all
475 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), Display Item::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fr agment.paginationOffset, paintFlags); 594 clipRecorder.emplace(*context, *m_paintLayer.layoutObject(), Display Item::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fr agment.paginationOffset, paintFlags);
476 if (DeprecatedPaintLayerScrollableArea* scrollableArea = m_paintLayer.sc rollableArea()) 595 if (DeprecatedPaintLayerScrollableArea* scrollableArea = m_paintLayer.sc rollableArea())
477 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context , roundedIntPoint(toPoint(fragment.layerBounds.location() - m_paintLayer.layoutB oxLocation())), pixelSnappedIntRect(fragment.backgroundRect.rect()), true); 596 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context , roundedIntPoint(toPoint(fragment.layerBounds.location() - m_paintLayer.layoutB oxLocation())), pixelSnappedIntRect(fragment.backgroundRect.rect()), true);
478 } 597 }
479 } 598 }
480 599
481 void DeprecatedPaintLayerPainter::paintFragmentWithPhase(PaintPhase phase, const DeprecatedPaintLayerFragment& fragment, GraphicsContext* context, const ClipRec t& clipRect, const DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags, ClipState clipState) 600 void DeprecatedPaintLayerPainter::paintFragmentWithPhase(PaintPhase phase, const DeprecatedPaintLayerFragment& fragment, GraphicsContext* context, const ClipRec t& clipRect, const DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutObject* paintingRootForLayoutObject, PaintLayerFlags paintFlags, ClipState clipState)
482 { 601 {
483 ASSERT(m_paintLayer.isSelfPaintingLayer()); 602 ASSERT(m_paintLayer.isSelfPaintingLayer());
484 603
604 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
605 PaintInfo paintInfo(context, enclosingIntRect(paintingInfo.paintDirtyRec t), phase, paintingInfo.globalPaintFlags(), paintFlags, paintingRootForLayoutObj ect, paintingInfo.rootLayer->layoutObject());
606 LayoutPoint paintOffset = toPoint(fragment.layerBounds.location() - m_pa intLayer.layoutBoxLocation());
607 m_paintLayer.layoutObject()->paint(paintInfo, paintOffset);
608 return;
609 }
610
485 Optional<LayerClipRecorder> clipRecorder; 611 Optional<LayerClipRecorder> clipRecorder;
486 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p aintingInfo, clipRect)) { 612 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p aintingInfo, clipRect)) {
487 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT ype(phase); 613 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT ype(phase);
488 LayerClipRecorder::BorderRadiusClippingRule clippingRule; 614 LayerClipRecorder::BorderRadiusClippingRule clippingRule;
489 switch (phase) { 615 switch (phase) {
490 case PaintPhaseBlockBackground: // Background painting will handle clipp ing to self. 616 case PaintPhaseBlockBackground: // Background painting will handle clipp ing to self.
491 case PaintPhaseSelfOutline: 617 case PaintPhaseSelfOutline:
492 case PaintPhaseMask: // Mask painting will handle clipping to self. 618 case PaintPhaseMask: // Mask painting will handle clipping to self.
493 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; 619 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius;
494 break; 620 break;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 if (!m_paintLayer.containsDirtyOverlayScrollbars()) 736 if (!m_paintLayer.containsDirtyOverlayScrollbars())
611 return; 737 return;
612 738
613 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot); 739 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot);
614 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 740 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
615 741
616 m_paintLayer.setContainsDirtyOverlayScrollbars(false); 742 m_paintLayer.setContainsDirtyOverlayScrollbars(false);
617 } 743 }
618 744
619 } // namespace blink 745 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698