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

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

Issue 1327563003: Don't cache subsequence whose layer is not fully contained by repaint rect (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), globalPaintFlags, LayoutSize(), paintingRoot); 48 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), globalPaintFlags, LayoutSize(), paintingRoot);
49 if (shouldPaintLayerInSoftwareMode(globalPaintFlags, paintFlags)) 49 if (shouldPaintLayerInSoftwareMode(globalPaintFlags, paintFlags))
50 paintLayer(context, paintingInfo, paintFlags); 50 paintLayer(context, paintingInfo, paintFlags);
51 } 51 }
52 52
53 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint Flags, const LayoutObject* layoutObject) 53 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint Flags, const LayoutObject* layoutObject)
54 { 54 {
55 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai ntLayerPaintingChildClippingMaskPhase && layoutObject->hasClipPath())) ? IgnoreO verflowClip : RespectOverflowClip; 55 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai ntLayerPaintingChildClippingMaskPhase && layoutObject->hasClipPath())) ? IgnoreO verflowClip : RespectOverflowClip;
56 } 56 }
57 57
58 void DeprecatedPaintLayerPainter::paintLayer(GraphicsContext* context, const Dep recatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 58 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer (GraphicsContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
59 {
60 PaintResult result = paintLayerInternal(context, paintingInfo, paintFlags);
61 m_paintLayer.clearNeedsRepaint();
62 return result;
63 }
64
65 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer Internal(GraphicsContext* context, const DeprecatedPaintLayerPaintingInfo& paint ingInfo, PaintLayerFlags paintFlags)
59 { 66 {
60 // https://code.google.com/p/chromium/issues/detail?id=343772 67 // https://code.google.com/p/chromium/issues/detail?id=343772
61 DisableCompositingQueryAsserts disabler; 68 DisableCompositingQueryAsserts disabler;
62 69
63 if (m_paintLayer.compositingState() != NotComposited) { 70 if (m_paintLayer.compositingState() != NotComposited) {
64 if (paintingInfo.globalPaintFlags() & GlobalPaintFlattenCompositingLayer s) { 71 if (paintingInfo.globalPaintFlags() & GlobalPaintFlattenCompositingLayer s) {
65 // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? Th at's for printing and drag-image. 72 // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? Th at's for printing and drag-image.
66 // FIXME: why isn't the code here global, as opposed to being set on each paintLayer() call? 73 // FIXME: why isn't the code here global, as opposed to being set on each paintLayer() call?
67 paintFlags |= PaintLayerUncachedClipRects; 74 paintFlags |= PaintLayerUncachedClipRects;
68 } 75 }
69 } 76 }
70 77
71 // Non self-painting leaf layers don't need to be painted as their layoutObj ect() should properly paint itself. 78 // Non self-painting leaf layers don't need to be painted as their layoutObj ect() should properly paint itself.
72 if (!m_paintLayer.isSelfPaintingLayer() && !m_paintLayer.hasSelfPaintingLaye rDescendant()) { 79 if (!m_paintLayer.isSelfPaintingLayer() && !m_paintLayer.hasSelfPaintingLaye rDescendant()) {
73 ASSERT(!m_paintLayer.needsRepaint()); 80 ASSERT(!m_paintLayer.needsRepaint());
74 return; 81 return FullyPainted;
75 } 82 }
76 83
77 bool needsRepaint = m_paintLayer.needsRepaint();
78 m_paintLayer.clearNeedsRepaint();
79
80 if (shouldSuppressPaintingLayer(&m_paintLayer)) 84 if (shouldSuppressPaintingLayer(&m_paintLayer))
81 return; 85 return FullyPainted;
82 86
83 // If this layer is totally invisible then there is nothing to paint. 87 // If this layer is totally invisible then there is nothing to paint.
84 if (!m_paintLayer.layoutObject()->opacity() && !m_paintLayer.layoutObject()- >hasBackdropFilter()) 88 if (!m_paintLayer.layoutObject()->opacity() && !m_paintLayer.layoutObject()- >hasBackdropFilter())
85 return; 89 return FullyPainted;
86
87 if (!needsRepaint && SubsequenceRecorder::useCachedSubsequenceIfPossible(*co ntext, m_paintLayer))
88 return;
89 SubsequenceRecorder subsequenceRecorder(*context, m_paintLayer);
90 90
91 if (m_paintLayer.paintsWithTransparency(paintingInfo.globalPaintFlags())) 91 if (m_paintLayer.paintsWithTransparency(paintingInfo.globalPaintFlags()))
92 paintFlags |= PaintLayerHaveTransparency; 92 paintFlags |= PaintLayerHaveTransparency;
93 93
94 LayerFixedPositionRecorder fixedPositionRecorder(*context, *m_paintLayer.lay outObject()); 94 LayerFixedPositionRecorder fixedPositionRecorder(*context, *m_paintLayer.lay outObject());
95 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 return paintLayerWithTransform(context, paintingInfo, paintFlags);
99 return;
100 }
101 99
102 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); 100 return paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
103 } 101 }
104 102
105 void DeprecatedPaintLayerPainter::paintLayerContentsAndReflection(GraphicsContex t* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlag s paintFlags, FragmentPolicy fragmentPolicy) 103 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer ContentsAndReflection(GraphicsContext* context, const DeprecatedPaintLayerPainti ngInfo& paintingInfo, PaintLayerFlags paintFlags, FragmentPolicy fragmentPolicy)
106 { 104 {
107 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay erDescendant()); 105 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay erDescendant());
108 106
109 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform) ; 107 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform) ;
110 108
111 // Paint the reflection first if we have one. 109 // Paint the reflection first if we have one.
112 if (m_paintLayer.reflectionInfo()) { 110 if (m_paintLayer.reflectionInfo()) {
113 ScopeRecorder scopeRecorder(*context); 111 ScopeRecorder scopeRecorder(*context);
114 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl ags | PaintLayerPaintingReflection); 112 m_paintLayer.reflectionInfo()->paint(context, paintingInfo, localPaintFl ags | PaintLayerPaintingReflection);
115 } 113 }
116 114
117 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; 115 localPaintFlags |= PaintLayerPaintingCompositingAllPhases;
118 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy); 116 return paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPo licy);
119 } 117 }
120 118
121 class ClipPathHelper { 119 class ClipPathHelper {
122 public: 120 public:
123 ClipPathHelper(GraphicsContext* context, const DeprecatedPaintLayer& paintLa yer, DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBou nds, bool& rootRelativeBoundsComputed, 121 ClipPathHelper(GraphicsContext* context, const DeprecatedPaintLayer& paintLa yer, DeprecatedPaintLayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBou nds, bool& rootRelativeBoundsComputed,
124 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) 122 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags)
125 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) 123 : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context)
126 { 124 {
127 const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); 125 const ComputedStyle& style = paintLayer.layoutObject()->styleRef();
128 126
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 SVGClipPainter(*m_resourceClipper).finishEffect(*m_paintLayer.layout Object(), m_context, m_clipperState); 171 SVGClipPainter(*m_resourceClipper).finishEffect(*m_paintLayer.layout Object(), m_context, m_clipperState);
174 } 172 }
175 private: 173 private:
176 LayoutSVGResourceClipper* m_resourceClipper; 174 LayoutSVGResourceClipper* m_resourceClipper;
177 Optional<ClipPathRecorder> m_clipPathRecorder; 175 Optional<ClipPathRecorder> m_clipPathRecorder;
178 SVGClipPainter::ClipperState m_clipperState; 176 SVGClipPainter::ClipperState m_clipperState;
179 const DeprecatedPaintLayer& m_paintLayer; 177 const DeprecatedPaintLayer& m_paintLayer;
180 GraphicsContext* m_context; 178 GraphicsContext* m_context;
181 }; 179 };
182 180
183 void DeprecatedPaintLayerPainter::paintLayerContents(GraphicsContext* context, c onst DeprecatedPaintLayerPaintingInfo& paintingInfoArg, PaintLayerFlags paintFla gs, FragmentPolicy fragmentPolicy) 181 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer Contents(GraphicsContext* context, const DeprecatedPaintLayerPaintingInfo& paint ingInfoArg, PaintLayerFlags paintFlags, FragmentPolicy fragmentPolicy)
184 { 182 {
185 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay erDescendant()); 183 ASSERT(m_paintLayer.isSelfPaintingLayer() || m_paintLayer.hasSelfPaintingLay erDescendant());
186 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); 184 ASSERT(!(paintFlags & PaintLayerAppliedTransform));
187 185
188 bool isSelfPaintingLayer = m_paintLayer.isSelfPaintingLayer(); 186 bool isSelfPaintingLayer = m_paintLayer.isSelfPaintingLayer();
189 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr ollbars; 187 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr ollbars;
190 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing ScrollingPhase; 188 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing ScrollingPhase;
191 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi tingForegroundPhase; 189 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi tingForegroundPhase;
192 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi tingBackgroundPhase; 190 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi tingBackgroundPhase;
193 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon tents; 191 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon tents;
194 // Outline always needs to be painted even if we have no visible content. Al so, 192 // Outline always needs to be painted even if we have no visible content. Al so,
195 // the outline is painted in the background phase during composited scrollin g. 193 // the outline is painted in the background phase during composited scrollin g.
196 // If it were painted in the foreground phase, it would move with the scroll ed 194 // If it were painted in the foreground phase, it would move with the scroll ed
197 // content. When not composited scrolling, the outline is painted in the 195 // content. When not composited scrolling, the outline is painted in the
198 // foreground phase. Since scrolled contents are moved by paint invalidation in this 196 // foreground phase. Since scrolled contents are moved by paint invalidation in this
199 // case, the outline won't get 'dragged along'. 197 // case, the outline won't get 'dragged along'.
200 bool shouldPaintOutline = isSelfPaintingLayer && !isPaintingOverlayScrollbar s 198 bool shouldPaintOutline = isSelfPaintingLayer && !isPaintingOverlayScrollbar s
201 && ((isPaintingScrollingContent && isPaintingCompositedBackground) 199 && ((isPaintingScrollingContent && isPaintingCompositedBackground)
202 || (!isPaintingScrollingContent && isPaintingCompositedForeground)); 200 || (!isPaintingScrollingContent && isPaintingCompositedForeground));
203 bool shouldPaintContent = m_paintLayer.hasVisibleContent() && isSelfPainting Layer && !isPaintingOverlayScrollbars; 201 bool shouldPaintContent = m_paintLayer.hasVisibleContent() && isSelfPainting Layer && !isPaintingOverlayScrollbars;
204 202
203 bool needsRepaint = m_paintLayer.needsRepaint();
204 m_paintLayer.clearNeedsRepaint();
205
206 PaintResult result = FullyPainted;
207
205 if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layou tObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement()) 208 if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layou tObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement())
206 return; 209 return result;
210
211 Optional<SubsequenceRecorder> subsequenceRecorder;
212 if (isPaintingOverlayScrollbars) {
213 // We should have cleared the repaint flag in the first pass.
214 ASSERT(!needsRepaint);
215 } else {
216 if (!needsRepaint && SubsequenceRecorder::useCachedSubsequenceIfPossible (*context, m_paintLayer))
217 return result;
218 subsequenceRecorder.emplace(*context, m_paintLayer);
219 }
207 220
208 DeprecatedPaintLayerPaintingInfo paintingInfo = paintingInfoArg; 221 DeprecatedPaintLayerPaintingInfo paintingInfo = paintingInfoArg;
209 222
210 // Ensure our lists are up-to-date. 223 // Ensure our lists are up-to-date.
211 m_paintLayer.stackingNode()->updateLayerListsIfNeeded(); 224 m_paintLayer.stackingNode()->updateLayerListsIfNeeded();
212 225
213 LayoutPoint offsetFromRoot; 226 LayoutPoint offsetFromRoot;
214 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); 227 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot);
215 228
216 if (m_paintLayer.compositingState() == PaintsIntoOwnBacking) 229 if (m_paintLayer.compositingState() == PaintsIntoOwnBacking)
217 offsetFromRoot.move(m_paintLayer.subpixelAccumulation()); 230 offsetFromRoot.move(m_paintLayer.subpixelAccumulation());
218 else 231 else
219 offsetFromRoot.move(paintingInfo.subPixelAccumulation); 232 offsetFromRoot.move(paintingInfo.subPixelAccumulation);
220 233
234 LayoutRect bounds = m_paintLayer.physicalBoundingBox(offsetFromRoot);
235 if (!paintingInfo.paintDirtyRect.contains(bounds))
236 result = NotFullyPainted;
237
221 LayoutRect rootRelativeBounds; 238 LayoutRect rootRelativeBounds;
222 bool rootRelativeBoundsComputed = false; 239 bool rootRelativeBoundsComputed = false;
223 240
224 if (paintingInfo.ancestorHasClipPathClipping && m_paintLayer.layoutObject()- >style()->position() != StaticPosition) 241 if (paintingInfo.ancestorHasClipPathClipping && m_paintLayer.layoutObject()- >style()->position() != StaticPosition)
225 UseCounter::count(m_paintLayer.layoutObject()->document(), UseCounter::C lipPathOfPositionedElement); 242 UseCounter::count(m_paintLayer.layoutObject()->document(), UseCounter::C lipPathOfPositionedElement);
226 243
227 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction, 244 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction,
228 // so they are nested properly. 245 // so they are nested properly.
229 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelat iveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); 246 ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelat iveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags);
230 247
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound); 291 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound);
275 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent; 292 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent;
276 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound; 293 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound;
277 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; 294 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars;
278 295
279 if (shouldPaintBackground) { 296 if (shouldPaintBackground) {
280 paintBackgroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, 297 paintBackgroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect,
281 localPaintingInfo, paintingRootForLayoutObject, paintFlags); 298 localPaintingInfo, paintingRootForLayoutObject, paintFlags);
282 } 299 }
283 300
284 if (shouldPaintNegZOrderList) 301 if (shouldPaintNegZOrderList) {
285 paintChildren(NegativeZOrderChildren, context, paintingInfo, paintFl ags); 302 if (paintChildren(NegativeZOrderChildren, context, paintingInfo, pai ntFlags) == NotFullyPainted)
303 result = NotFullyPainted;
304 }
286 305
287 if (shouldPaintOwnContents) { 306 if (shouldPaintOwnContents) {
288 paintForegroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, 307 paintForegroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect,
289 localPaintingInfo, paintingRootForLayoutObject, selectionOnly, p aintFlags); 308 localPaintingInfo, paintingRootForLayoutObject, selectionOnly, p aintFlags);
290 } 309 }
291 310
292 if (shouldPaintOutline) 311 if (shouldPaintOutline)
293 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags); 312 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags);
294 313
295 if (shouldPaintNormalFlowAndPosZOrderLists) 314 if (shouldPaintNormalFlowAndPosZOrderLists) {
296 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, paintingInfo, paintFlags); 315 if (paintChildren(NormalFlowChildren | PositiveZOrderChildren, conte xt, paintingInfo, paintFlags) == NotFullyPainted)
316 result = NotFullyPainted;
317 }
297 318
298 if (shouldPaintOverlayScrollbars) 319 if (shouldPaintOverlayScrollbars)
299 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags); 320 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags);
300 } // FilterPainter block 321 } // FilterPainter block
301 322
302 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn ly; 323 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn ly;
303 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly; 324 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly;
304 325
305 if (shouldPaintMask) 326 if (shouldPaintMask)
306 paintMaskForFragments(layerFragments, context, localPaintingInfo, painti ngRootForLayoutObject, paintFlags); 327 paintMaskForFragments(layerFragments, context, localPaintingInfo, painti ngRootForLayoutObject, paintFlags);
307 if (shouldPaintClippingMask) { 328 if (shouldPaintClippingMask) {
308 // Paint the border radius mask for the fragments. 329 // Paint the border radius mask for the fragments.
309 paintChildClippingMaskForFragments(layerFragments, context, localPaintin gInfo, paintingRootForLayoutObject, paintFlags); 330 paintChildClippingMaskForFragments(layerFragments, context, localPaintin gInfo, paintingRootForLayoutObject, paintFlags);
310 } 331 }
332
333 // Set subsequence not cacheable if the bounding box of this layer and desce ndants is not fully contained
334 // by paintRect, because later paintRect changes may expose new contents whi ch will need repainting.
335 if (result == NotFullyPainted && subsequenceRecorder)
336 subsequenceRecorder->setUncacheable();
337
338 return result;
311 } 339 }
312 340
313 bool DeprecatedPaintLayerPainter::needsToClip(const DeprecatedPaintLayerPainting Info& localPaintingInfo, const ClipRect& clipRect) 341 bool DeprecatedPaintLayerPainter::needsToClip(const DeprecatedPaintLayerPainting Info& localPaintingInfo, const ClipRect& clipRect)
314 { 342 {
315 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius(); 343 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius();
316 } 344 }
317 345
318 bool DeprecatedPaintLayerPainter::atLeastOneFragmentIntersectsDamageRect(Depreca tedPaintLayerFragments& fragments, const DeprecatedPaintLayerPaintingInfo& local PaintingInfo, PaintLayerFlags localPaintFlags, const LayoutPoint& offsetFromRoot ) 346 bool DeprecatedPaintLayerPainter::atLeastOneFragmentIntersectsDamageRect(Depreca tedPaintLayerFragments& fragments, const DeprecatedPaintLayerPaintingInfo& local PaintingInfo, PaintLayerFlags localPaintFlags, const LayoutPoint& offsetFromRoot )
319 { 347 {
320 if (m_paintLayer.enclosingPaginationLayer()) 348 if (m_paintLayer.enclosingPaginationLayer())
321 return true; // The fragments created have already been found to interse ct with the damage rect. 349 return true; // The fragments created have already been found to interse ct with the damage rect.
322 350
323 if (&m_paintLayer == localPaintingInfo.rootLayer && (localPaintFlags & Paint LayerPaintingOverflowContents)) 351 if (&m_paintLayer == localPaintingInfo.rootLayer && (localPaintFlags & Paint LayerPaintingOverflowContents))
324 return true; 352 return true;
325 353
326 for (DeprecatedPaintLayerFragment& fragment: fragments) { 354 for (DeprecatedPaintLayerFragment& fragment: fragments) {
327 LayoutPoint newOffsetFromRoot = offsetFromRoot + fragment.paginationOffs et; 355 LayoutPoint newOffsetFromRoot = offsetFromRoot + fragment.paginationOffs et;
328 // Note that this really only works reliably on the first fragment. If t he layer has visible 356 // Note that this really only works reliably on the first fragment. If t he layer has visible
329 // overflow and a subsequent fragment doesn't intersect with the border box of the layer 357 // overflow and a subsequent fragment doesn't intersect with the border box of the layer
330 // (i.e. only contains an overflow portion of the layer), intersection w ill fail. The reason 358 // (i.e. only contains an overflow portion of the layer), intersection w ill fail. The reason
331 // for this is that fragment.layerBounds is set to the border box, not t he bounding box, of 359 // for this is that fragment.layerBounds is set to the border box, not t he bounding box, of
332 // the layer. 360 // the layer.
333 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac kgroundRect.rect(), newOffsetFromRoot)) 361 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, fragment.bac kgroundRect.rect(), newOffsetFromRoot))
334 return true; 362 return true;
335 } 363 }
336 return false; 364 return false;
337 } 365 }
338 366
339 void DeprecatedPaintLayerPainter::paintLayerWithTransform(GraphicsContext* conte xt, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintF lags) 367 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer WithTransform(GraphicsContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
340 { 368 {
341 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint ingInfo.globalPaintFlags()); 369 TransformationMatrix layerTransform = m_paintLayer.renderableTransform(paint ingInfo.globalPaintFlags());
342 // If the transform can't be inverted, then don't paint anything. 370 // If the transform can't be inverted, then don't paint anything.
343 if (!layerTransform.isInvertible()) 371 if (!layerTransform.isInvertible())
344 return; 372 return FullyPainted;
345 373
346 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer here. 374 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer here.
347 // m_paintLayer may be the "root", and then we should avoid looking at its p arent. 375 // m_paintLayer may be the "root", and then we should avoid looking at its p arent.
348 DeprecatedPaintLayer* parentLayer = m_paintLayer.parent(); 376 DeprecatedPaintLayer* parentLayer = m_paintLayer.parent();
349 377
350 ClipRect ancestorBackgroundClipRect; 378 ClipRect ancestorBackgroundClipRect;
351 if (parentLayer) { 379 if (parentLayer) {
352 // Calculate the clip rectangle that the ancestors establish. 380 // Calculate the clip rectangle that the ancestors establish.
353 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOver layScrollbarSize); 381 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOver layScrollbarSize);
354 if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) = = IgnoreOverflowClip) 382 if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) = = IgnoreOverflowClip)
(...skipping 18 matching lines...) Expand all
373 // We don't need to collect any fragments in the regular way here. We ha ve already 401 // We don't need to collect any fragments in the regular way here. We ha ve already
374 // calculated a clip rectangle for the ancestry if it was needed, and cl ipping this 402 // calculated a clip rectangle for the ancestry if it was needed, and cl ipping this
375 // layer is something that can be done further down the path, when the t ransform has 403 // layer is something that can be done further down the path, when the t ransform has
376 // been applied. 404 // been applied.
377 DeprecatedPaintLayerFragment fragment; 405 DeprecatedPaintLayerFragment fragment;
378 fragment.backgroundRect = paintingInfo.paintDirtyRect; 406 fragment.backgroundRect = paintingInfo.paintDirtyRect;
379 fragments.append(fragment); 407 fragments.append(fragment);
380 } 408 }
381 409
382 bool needsScope = fragments.size() > 1; 410 bool needsScope = fragments.size() > 1;
411 PaintResult result = FullyPainted;
383 for (const auto& fragment : fragments) { 412 for (const auto& fragment : fragments) {
384 Optional<ScopeRecorder> scopeRecorder; 413 Optional<ScopeRecorder> scopeRecorder;
385 if (needsScope) 414 if (needsScope)
386 scopeRecorder.emplace(*context); 415 scopeRecorder.emplace(*context);
387 Optional<LayerClipRecorder> clipRecorder; 416 Optional<LayerClipRecorder> clipRecorder;
388 if (parentLayer) { 417 if (parentLayer) {
389 ClipRect clipRectForFragment(ancestorBackgroundClipRect); 418 ClipRect clipRectForFragment(ancestorBackgroundClipRect);
390 clipRectForFragment.moveBy(fragment.paginationOffset); 419 clipRectForFragment.moveBy(fragment.paginationOffset);
391 clipRectForFragment.intersect(fragment.backgroundRect); 420 clipRectForFragment.intersect(fragment.backgroundRect);
392 if (clipRectForFragment.isEmpty()) 421 if (clipRectForFragment.isEmpty())
393 continue; 422 continue;
394 if (needsToClip(paintingInfo, clipRectForFragment)) { 423 if (needsToClip(paintingInfo, clipRectForFragment)) {
395 if (m_paintLayer.layoutObject()->style()->position() != StaticPo sition && clipRectForFragment.isClippedByClipCss()) 424 if (m_paintLayer.layoutObject()->style()->position() != StaticPo sition && clipRectForFragment.isClippedByClipCss())
396 UseCounter::count(m_paintLayer.layoutObject()->document(), U seCounter::ClipCssOfPositionedElement); 425 UseCounter::count(m_paintLayer.layoutObject()->document(), U seCounter::ClipCssOfPositionedElement);
397 clipRecorder.emplace(*context, *parentLayer->layoutObject(), Dis playItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginati onOffset, paintFlags); 426 clipRecorder.emplace(*context, *parentLayer->layoutObject(), Dis playItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginati onOffset, paintFlags);
398 } 427 }
399 } 428 }
400 429 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, fragment.paginationOffset) == NotFullyPainted)
401 paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, frag ment.paginationOffset); 430 result = NotFullyPainted;
402 } 431 }
432 return result;
403 } 433 }
404 434
405 void DeprecatedPaintLayerPainter::paintFragmentByApplyingTransform(GraphicsConte xt* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintLayerFla gs paintFlags, const LayoutPoint& fragmentTranslation) 435 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintFragm entByApplyingTransform(GraphicsContext* context, const DeprecatedPaintLayerPaint ingInfo& paintingInfo, PaintLayerFlags paintFlags, const LayoutPoint& fragmentTr anslation)
406 { 436 {
407 // This involves subtracting out the position of the layer in our current co ordinate space, but preserving 437 // This involves subtracting out the position of the layer in our current co ordinate space, but preserving
408 // the accumulated error for sub-pixel layout. 438 // the accumulated error for sub-pixel layout.
409 LayoutPoint delta; 439 LayoutPoint delta;
410 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); 440 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta);
411 delta.moveBy(fragmentTranslation); 441 delta.moveBy(fragmentTranslation);
412 TransformationMatrix transform(m_paintLayer.renderableTransform(paintingInfo .globalPaintFlags())); 442 TransformationMatrix transform(m_paintLayer.renderableTransform(paintingInfo .globalPaintFlags()));
413 IntPoint roundedDelta = roundedIntPoint(delta); 443 IntPoint roundedDelta = roundedIntPoint(delta);
414 transform.translateRight(roundedDelta.x(), roundedDelta.y()); 444 transform.translateRight(roundedDelta.x(), roundedDelta.y());
415 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation + (delta - roundedDelta); 445 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation + (delta - roundedDelta);
416 446
417 Transform3DRecorder transform3DRecorder(*context, *m_paintLayer.layoutObject (), DisplayItem::Transform3DElementTransform, transform); 447 Transform3DRecorder transform3DRecorder(*context, *m_paintLayer.layoutObject (), DisplayItem::Transform3DElementTransform, transform);
418 448
419 // Now do a paint with the root layer shifted to be us. 449 // Now do a paint with the root layer shifted to be us.
420 DeprecatedPaintLayerPaintingInfo transformedPaintingInfo(&m_paintLayer, Layo utRect(enclosingIntRect(transform.inverse().mapRect(paintingInfo.paintDirtyRect) )), paintingInfo.globalPaintFlags(), 450 DeprecatedPaintLayerPaintingInfo transformedPaintingInfo(&m_paintLayer, Layo utRect(enclosingIntRect(transform.inverse().mapRect(paintingInfo.paintDirtyRect) )), paintingInfo.globalPaintFlags(),
421 adjustedSubPixelAccumulation, paintingInfo.paintingRoot); 451 adjustedSubPixelAccumulation, paintingInfo.paintingRoot);
422 transformedPaintingInfo.ancestorHasClipPathClipping = paintingInfo.ancestorH asClipPathClipping; 452 transformedPaintingInfo.ancestorHasClipPathClipping = paintingInfo.ancestorH asClipPathClipping;
423 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags , ForceSingleFragment); 453 return paintLayerContentsAndReflection(context, transformedPaintingInfo, pai ntFlags, ForceSingleFragment);
424 } 454 }
425 455
426 void DeprecatedPaintLayerPainter::paintChildren(unsigned childrenToVisit, Graphi csContext* context, const DeprecatedPaintLayerPaintingInfo& paintingInfo, PaintL ayerFlags paintFlags) 456 DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintChild ren(unsigned childrenToVisit, GraphicsContext* context, const DeprecatedPaintLay erPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
427 { 457 {
458 PaintResult result = FullyPainted;
428 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) 459 if (!m_paintLayer.hasSelfPaintingLayerDescendant())
429 return; 460 return result;
430 461
431 #if ENABLE(ASSERT) 462 #if ENABLE(ASSERT)
432 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); 463 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode());
433 #endif 464 #endif
434 465
435 IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation; 466 IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation;
436 if (m_paintLayer.layoutObject()->hasOverflowClip()) 467 if (m_paintLayer.layoutObject()->hasOverflowClip())
437 scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOff set(); 468 scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOff set();
438 469
439 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit); 470 DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode (), childrenToVisit);
440 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { 471 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) {
441 DeprecatedPaintLayerPainter childPainter(*child->layer()); 472 DeprecatedPaintLayerPainter childPainter(*child->layer());
442 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents() 473 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents()
443 // and CompositedDeprecatedPaintLayerMapping::doPaintTask(). 474 // and CompositedDeprecatedPaintLayerMapping::doPaintTask().
444 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo.globalPain tFlags(), paintFlags)) 475 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo.globalPain tFlags(), paintFlags))
445 continue; 476 continue;
446 477
447 DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo; 478 DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo;
448 childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation; 479 childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation;
449 // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer. 480 // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer.
450 for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); paren tLayer != &m_paintLayer; parentLayer = parentLayer->parent()) { 481 for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); paren tLayer != &m_paintLayer; parentLayer = parentLayer->parent()) {
451 if (parentLayer->layoutObject()->hasOverflowClip()) 482 if (parentLayer->layoutObject()->hasOverflowClip())
452 childPaintingInfo.scrollOffsetAccumulation += parentLayer->layou tBox()->scrolledContentOffset(); 483 childPaintingInfo.scrollOffsetAccumulation += parentLayer->layou tBox()->scrolledContentOffset();
453 } 484 }
454 485
455 childPainter.paintLayer(context, childPaintingInfo, paintFlags); 486 if (childPainter.paintLayer(context, childPaintingInfo, paintFlags) == N otFullyPainted)
487 result = NotFullyPainted;
456 } 488 }
489 return result;
457 } 490 }
458 491
459 // FIXME: inline this. 492 // FIXME: inline this.
460 static bool paintForFixedRootBackground(const DeprecatedPaintLayer* layer, Paint LayerFlags paintFlags) 493 static bool paintForFixedRootBackground(const DeprecatedPaintLayer* layer, Paint LayerFlags paintFlags)
461 { 494 {
462 return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLaye rPaintingRootBackgroundOnly); 495 return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLaye rPaintingRootBackgroundOnly);
463 } 496 }
464 497
465 bool DeprecatedPaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPai ntFlags globalPaintFlags, PaintLayerFlags paintFlags) 498 bool DeprecatedPaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPai ntFlags globalPaintFlags, PaintLayerFlags paintFlags)
466 { 499 {
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 if (!m_paintLayer.containsDirtyOverlayScrollbars()) 654 if (!m_paintLayer.containsDirtyOverlayScrollbars())
622 return; 655 return;
623 656
624 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot); 657 DeprecatedPaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(encl osingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot);
625 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 658 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
626 659
627 m_paintLayer.setContainsDirtyOverlayScrollbars(false); 660 m_paintLayer.setContainsDirtyOverlayScrollbars(false);
628 } 661 }
629 662
630 } // namespace blink 663 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698