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

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

Issue 653303003: Generalize paint chunks to clips, and implement clips in LayerPainter. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix Created 6 years, 2 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
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/ViewDisplayList.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/LayerPainter.h" 6 #include "core/paint/LayerPainter.h"
7 7
8 #include "core/frame/Settings.h" 8 #include "core/frame/Settings.h"
9 #include "core/page/Page.h" 9 #include "core/page/Page.h"
10 #include "core/rendering/ClipPathOperation.h" 10 #include "core/rendering/ClipPathOperation.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 beginTransparencyLayers(context, paintingInfo.rootLayer, paintin gInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehav ior); 83 beginTransparencyLayers(context, paintingInfo.rootLayer, paintin gInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehav ior);
84 } 84 }
85 85
86 if (m_renderLayer.enclosingPaginationLayer()) { 86 if (m_renderLayer.enclosingPaginationLayer()) {
87 paintTransformedLayerIntoFragments(context, paintingInfo, paintFlags ); 87 paintTransformedLayerIntoFragments(context, paintingInfo, paintFlags );
88 return; 88 return;
89 } 89 }
90 90
91 // Make sure the parent's clip rects have been calculated. 91 // Make sure the parent's clip rects have been calculated.
92 ClipRect clipRect = paintingInfo.paintDirtyRect; 92 ClipRect clipRect = paintingInfo.paintDirtyRect;
93
94 OwnPtr<ClipRecorder> clipRecorder;
93 if (m_renderLayer.parent()) { 95 if (m_renderLayer.parent()) {
94 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlag s & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, Ignore OverlayScrollbarSize); 96 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlag s & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, Ignore OverlayScrollbarSize);
95 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()) == IgnoreOverflowClip) 97 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()) == IgnoreOverflowClip)
96 clipRectsContext.setIgnoreOverflowClip(); 98 clipRectsContext.setIgnoreOverflowClip();
97 clipRect = m_renderLayer.clipper().backgroundClipRect(clipRectsConte xt); 99 clipRect = m_renderLayer.clipper().backgroundClipRect(clipRectsConte xt);
98 clipRect.intersect(paintingInfo.paintDirtyRect); 100 clipRect.intersect(paintingInfo.paintDirtyRect);
99 101
100 // Push the parent coordinate space's clip. 102 if (needsToClip(paintingInfo, clipRect)) {
101 LayerPainter(*m_renderLayer.parent()).clipToRect(paintingInfo, conte xt, clipRect, paintFlags); 103 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.parent(), context, ClipDisplayItem::LayerParent, clipRect));
104
105 LayerPainter(*m_renderLayer.parent()).applyRoundedRectClips(pain tingInfo, context, clipRect, paintFlags, *clipRecorder);
106 }
102 } 107 }
103 108
104 paintLayerByApplyingTransform(context, paintingInfo, paintFlags); 109 paintLayerByApplyingTransform(context, paintingInfo, paintFlags);
105 110
106 // Restore the clip.
107 if (m_renderLayer.parent())
108 LayerPainter(*m_renderLayer.parent()).restoreClip(context, paintingI nfo.paintDirtyRect, clipRect);
109
110 return; 111 return;
111 } 112 }
112 113
113 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); 114 paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
114 } 115 }
115 116
116 void LayerPainter::beginTransparencyLayers(GraphicsContext* context, const Rende rLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelA ccumulation, PaintBehavior paintBehavior) 117 void LayerPainter::beginTransparencyLayers(GraphicsContext* context, const Rende rLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelA ccumulation, PaintBehavior paintBehavior)
117 { 118 {
118 bool createTransparencyLayerForBlendMode = m_renderLayer.stackingNode()->isS tackingContext() && m_renderLayer.hasDescendantWithBlendMode(); 119 bool createTransparencyLayerForBlendMode = m_renderLayer.stackingNode()->isS tackingContext() && m_renderLayer.hasDescendantWithBlendMode();
119 if ((m_renderLayer.paintsWithTransparency(paintBehavior) || m_renderLayer.pa intsWithBlendMode() || createTransparencyLayerForBlendMode) && m_renderLayer.use dTransparency()) 120 if ((m_renderLayer.paintsWithTransparency(paintBehavior) || m_renderLayer.pa intsWithBlendMode() || createTransparencyLayerForBlendMode) && m_renderLayer.use dTransparency())
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 LayerFragments layerFragments; 259 LayerFragments layerFragments;
259 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) { 260 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) {
260 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment, as well as whether or not the content of each 261 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment, as well as whether or not the content of each
261 // fragment should paint. 262 // fragment should paint.
262 m_renderLayer.collectFragments(layerFragments, localPaintingInfo.rootLay er, localPaintingInfo.paintDirtyRect, 263 m_renderLayer.collectFragments(layerFragments, localPaintingInfo.rootLay er, localPaintingInfo.paintDirtyRect,
263 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Pai ntingClipRects, IgnoreOverlayScrollbarSize, 264 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Pai ntingClipRects, IgnoreOverlayScrollbarSize,
264 shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()), &of fsetFromRoot, localPaintingInfo.subPixelAccumulation); 265 shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()), &of fsetFromRoot, localPaintingInfo.subPixelAccumulation);
265 updatePaintingInfoForFragments(layerFragments, localPaintingInfo, paintF lags, shouldPaintContent, &offsetFromRoot); 266 updatePaintingInfoForFragments(layerFragments, localPaintingInfo, paintF lags, shouldPaintContent, &offsetFromRoot);
266 } 267 }
267 268
268 if (haveFilterEffect) { 269 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelecti onOnly;
269 ASSERT(m_renderLayer.filterInfo());
270
271 if (!rootRelativeBoundsComputed)
272 rootRelativeBounds = m_renderLayer.physicalBoundingBoxIncludingRefle ctionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot);
273
274 // Do transparency and clipping before starting filter processing.
275 if (haveTransparency) {
276 // If we have a filter and transparency, we have to eagerly start a transparency layer here, rather than risk a child layer lazily starts one after filter processing.
277 beginTransparencyLayers(context, localPaintingInfo.rootLayer, painti ngInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, localPaintingInfo.pain tBehavior);
278 }
279 // We'll handle clipping to the dirty rect before filter rasterization.
280 // Filter processing will automatically expand the clip rect and the off screen to accommodate any filter outsets.
281 // FIXME: It is incorrect to just clip to the damageRect here once multi ple fragments are involved.
282 ClipRect backgroundRect = layerFragments.isEmpty() ? ClipRect() : layerF ragments[0].backgroundRect;
283 clipToRect(localPaintingInfo, context, backgroundRect, paintFlags);
284 // Subsequent code should not clip to the dirty rect, since we've alread y
285 // done it above, and doing it later will defeat the outsets.
286 localPaintingInfo.clipToDirtyRect = false;
287 haveFilterEffect = m_renderLayer.filterRenderer()->beginFilterEffect(con text, rootRelativeBounds);
288 if (!haveFilterEffect) {
289 // If the the filter failed to start, undo the clip immediately
290 restoreClip(context, localPaintingInfo.paintDirtyRect, backgroundRec t);
291 }
292 }
293
294 // If this layer's renderer is a child of the paintingRoot, we render uncond itionally, which 270 // If this layer's renderer is a child of the paintingRoot, we render uncond itionally, which
295 // is done by passing a nil paintingRoot down to our renderer (as if no pain tingRoot was ever set). 271 // is done by passing a nil paintingRoot down to our renderer (as if no pain tingRoot was ever set).
296 // Else, our renderer tree may or may not contain the painting root, so we p ass that root along 272 // Else, our renderer tree may or may not contain the painting root, so we p ass that root along
297 // so it will be tested against as we descend through the renderers. 273 // so it will be tested against as we descend through the renderers.
298 RenderObject* paintingRootForRenderer = 0; 274 RenderObject* paintingRootForRenderer = 0;
299 if (localPaintingInfo.paintingRoot && !m_renderLayer.renderer()->isDescendan tOf(localPaintingInfo.paintingRoot)) 275 if (localPaintingInfo.paintingRoot && !m_renderLayer.renderer()->isDescendan tOf(localPaintingInfo.paintingRoot))
300 paintingRootForRenderer = localPaintingInfo.paintingRoot; 276 paintingRootForRenderer = localPaintingInfo.paintingRoot;
301 277
302 ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText)); 278 { // Begin block for the lifetime of any filter clip.
303 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelecti onOnly; 279 OwnPtr<ClipRecorder> clipRecorder;
280 if (haveFilterEffect) {
281 ASSERT(m_renderLayer.filterInfo());
304 282
305 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPaintCo ntent && !selectionOnly; 283 if (!rootRelativeBoundsComputed)
306 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintingOve rflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackground ); 284 rootRelativeBounds = m_renderLayer.physicalBoundingBoxIncludingR eflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot);
307 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPaintC ontent; 285
308 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForeground ; 286 // Do transparency and clipping before starting filter processing.
309 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; 287 if (haveTransparency) {
288 // If we have a filter and transparency, we have to eagerly star t a transparency layer here, rather than risk a child layer lazily starts one af ter filter processing.
289 beginTransparencyLayers(context, localPaintingInfo.rootLayer, pa intingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, localPaintingInfo. paintBehavior);
290 }
291
292 // We'll handle clipping to the dirty rect before filter rasterizati on.
293 // Filter processing will automatically expand the clip rect and the offscreen to accommodate any filter outsets.
294 // FIXME: It is incorrect to just clip to the damageRect here once m ultiple fragments are involved.
295 ClipRect backgroundRect = layerFragments.isEmpty() ? ClipRect() : la yerFragments[0].backgroundRect;
296
297 if (needsToClip(localPaintingInfo, backgroundRect)) {
298 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context , ClipDisplayItem::LayerFilter, backgroundRect));
299 applyRoundedRectClips(localPaintingInfo, context, backgroundRect , paintFlags, *clipRecorder);
300 }
301
302 // Subsequent code should not clip to the dirty rect, since we've al ready
303 // done it above, and doing it later will defeat the outsets.
304 localPaintingInfo.clipToDirtyRect = false;
305 haveFilterEffect = m_renderLayer.filterRenderer()->beginFilterEffect (context, rootRelativeBounds);
306 if (!haveFilterEffect) {
307 // If the the filter failed to start, undo the clip immediately
308 clipRecorder.clear();
309 }
310 }
311
312 ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText)) ;
313
314 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly;
315 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintin gOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackgr ound);
316 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPa intContent;
317 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForegr ound;
318 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars;
319
320 PaintBehavior paintBehavior = PaintBehaviorNormal;
321 if (paintFlags & PaintLayerPaintingSkipRootBackground)
322 paintBehavior |= PaintBehaviorSkipRootBackground;
323 else if (paintFlags & PaintLayerPaintingRootBackgroundOnly)
324 paintBehavior |= PaintBehaviorRootBackgroundOnly;
325
326 if (shouldPaintBackground) {
327 paintBackgroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, haveTransparency,
328 localPaintingInfo, paintBehavior, paintingRootForRenderer, paint Flags);
329 }
330
331 if (shouldPaintNegZOrderList)
332 paintChildren(NegativeZOrderChildren, context, paintingInfo, paintFl ags);
333
334 if (shouldPaintOwnContents) {
335 paintForegroundForFragments(layerFragments, context, paintingInfo.pa intDirtyRect, haveTransparency,
336 localPaintingInfo, paintBehavior, paintingRootForRenderer, selec tionOnly, paintFlags);
337 }
338
339 if (shouldPaintOutline)
340 paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
341
342 if (shouldPaintNormalFlowAndPosZOrderLists)
343 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, paintingInfo, paintFlags);
344
345 if (shouldPaintOverlayScrollbars)
346 paintOverflowControlsForFragments(layerFragments, context, localPain tingInfo, paintFlags);
347
348 if (haveFilterEffect) {
349 // Apply the correct clipping (ie. overflow: hidden).
350 // FIXME: It is incorrect to just clip to the damageRect here once m ultiple fragments are involved.
351 m_renderLayer.filterRenderer()->endFilterEffect(context);
352 }
353 } // Filter clip block
354
310 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_renderLayer.renderer()->hasMask() && !selectionOnly; 355 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && m_renderLayer.renderer()->hasMask() && !selectionOnly;
311 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly; 356 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping MaskPhase) && shouldPaintContent && !selectionOnly;
312 357
313 PaintBehavior paintBehavior = PaintBehaviorNormal;
314 if (paintFlags & PaintLayerPaintingSkipRootBackground)
315 paintBehavior |= PaintBehaviorSkipRootBackground;
316 else if (paintFlags & PaintLayerPaintingRootBackgroundOnly)
317 paintBehavior |= PaintBehaviorRootBackgroundOnly;
318
319 if (shouldPaintBackground) {
320 paintBackgroundForFragments(layerFragments, context, paintingInfo.paintD irtyRect, haveTransparency,
321 localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlag s);
322 }
323
324 if (shouldPaintNegZOrderList)
325 paintChildren(NegativeZOrderChildren, context, paintingInfo, paintFlags) ;
326
327 if (shouldPaintOwnContents) {
328 paintForegroundForFragments(layerFragments, context, paintingInfo.paintD irtyRect, haveTransparency,
329 localPaintingInfo, paintBehavior, paintingRootForRenderer, selection Only, paintFlags);
330 }
331
332 if (shouldPaintOutline)
333 paintOutlineForFragments(layerFragments, context, localPaintingInfo, pai ntBehavior, paintingRootForRenderer, paintFlags);
334
335 if (shouldPaintNormalFlowAndPosZOrderLists)
336 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, pain tingInfo, paintFlags);
337
338 if (shouldPaintOverlayScrollbars)
339 paintOverflowControlsForFragments(layerFragments, context, localPainting Info, paintFlags);
340
341 if (haveFilterEffect) {
342 // Apply the correct clipping (ie. overflow: hidden).
343 // FIXME: It is incorrect to just clip to the damageRect here once multi ple fragments are involved.
344 ClipRect backgroundRect = layerFragments.isEmpty() ? ClipRect() : layerF ragments[0].backgroundRect;
345 m_renderLayer.filterRenderer()->endFilterEffect(context);
346 restoreClip(context, localPaintingInfo.paintDirtyRect, backgroundRect);
347 }
348
349 if (shouldPaintMask) 358 if (shouldPaintMask)
350 paintMaskForFragments(layerFragments, context, localPaintingInfo, painti ngRootForRenderer, paintFlags); 359 paintMaskForFragments(layerFragments, context, localPaintingInfo, painti ngRootForRenderer, paintFlags);
351 360
352 if (shouldPaintClippingMask) { 361 if (shouldPaintClippingMask) {
353 // Paint the border radius mask for the fragments. 362 // Paint the border radius mask for the fragments.
354 paintChildClippingMaskForFragments(layerFragments, context, localPaintin gInfo, paintingRootForRenderer, paintFlags); 363 paintChildClippingMaskForFragments(layerFragments, context, localPaintin gInfo, paintingRootForRenderer, paintFlags);
355 } 364 }
356 365
357 // End our transparency layer 366 // End our transparency layer
358 if ((haveTransparency || m_renderLayer.paintsWithBlendMode() || createTransp arencyLayerForBlendMode) && m_renderLayer.usedTransparency() 367 if ((haveTransparency || m_renderLayer.paintsWithBlendMode() || createTransp arencyLayerForBlendMode) && m_renderLayer.usedTransparency()
(...skipping 14 matching lines...) Expand all
373 382
374 RenderView* view = startLayer->renderer()->view(); 383 RenderView* view = startLayer->renderer()->view();
375 for (RenderBlock* currentBlock = startLayer->renderer()->containingBlock(); currentBlock && currentBlock != view; currentBlock = currentBlock->containingBlo ck()) { 384 for (RenderBlock* currentBlock = startLayer->renderer()->containingBlock(); currentBlock && currentBlock != view; currentBlock = currentBlock->containingBlo ck()) {
376 if (currentBlock->layer() == endLayer) 385 if (currentBlock->layer() == endLayer)
377 return true; 386 return true;
378 } 387 }
379 388
380 return false; 389 return false;
381 } 390 }
382 391
383 void LayerPainter::clipToRect(const LayerPaintingInfo& localPaintingInfo, Graphi csContext* context, const ClipRect& clipRect, 392 bool LayerPainter::needsToClip(const LayerPaintingInfo& localPaintingInfo, const ClipRect& clipRect)
384 PaintLayerFlags paintFlags, BorderRadiusClippingRule rule)
385 { 393 {
386 if (clipRect.rect() == localPaintingInfo.paintDirtyRect && !clipRect.hasRadi us()) 394 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa dius();
387 return; 395 }
388 context->save();
389 context->clip(pixelSnappedIntRect(clipRect.rect()));
390 396
397 void LayerPainter::applyRoundedRectClips(const LayerPaintingInfo& localPaintingI nfo, GraphicsContext* context, const ClipRect& clipRect,
398 PaintLayerFlags paintFlags, ClipRecorder& clipRecorder, BorderRadiusClipping Rule rule)
399 {
391 if (!clipRect.hasRadius()) 400 if (!clipRect.hasRadius())
392 return; 401 return;
393 402
394 // If the clip rect has been tainted by a border radius, then we have to wal k up our layer chain applying the clips from 403 // If the clip rect has been tainted by a border radius, then we have to wal k up our layer chain applying the clips from
395 // any layers with overflow. The condition for being able to apply these cli ps is that the overflow object be in our 404 // any layers with overflow. The condition for being able to apply these cli ps is that the overflow object be in our
396 // containing block chain so we check that also. 405 // containing block chain so we check that also.
397 for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? &m_renderLaye r : m_renderLayer.parent(); layer; layer = layer->parent()) { 406 for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? &m_renderLaye r : m_renderLayer.parent(); layer; layer = layer->parent()) {
398 // Composited scrolling layers handle border-radius clip in the composit or via a mask layer. We do not 407 // Composited scrolling layers handle border-radius clip in the composit or via a mask layer. We do not
399 // want to apply a border-radius clip to the layer contents itself, beca use that would require re-rastering 408 // want to apply a border-radius clip to the layer contents itself, beca use that would require re-rastering
400 // every frame to update the clip. We only want to make sure that the ma sk layer is properly clipped so 409 // every frame to update the clip. We only want to make sure that the ma sk layer is properly clipped so
401 // that it can in turn clip the scrolled contents in the compositor. 410 // that it can in turn clip the scrolled contents in the compositor.
402 if (layer->needsCompositedScrolling() && !(paintFlags & PaintLayerPainti ngChildClippingMaskPhase)) 411 if (layer->needsCompositedScrolling() && !(paintFlags & PaintLayerPainti ngChildClippingMaskPhase))
403 break; 412 break;
404 413
405 if (layer->renderer()->hasOverflowClip() && layer->renderer()->style()-> hasBorderRadius() && inContainingBlockChain(&m_renderLayer, layer)) { 414 if (layer->renderer()->hasOverflowClip() && layer->renderer()->style()-> hasBorderRadius() && inContainingBlockChain(&m_renderLayer, layer)) {
406 LayoutPoint delta; 415 LayoutPoint delta;
407 layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta); 416 layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta);
408 context->clipRoundedRect(layer->renderer()->style()->getRoundedInner BorderFor(LayoutRect(delta, layer->size()))); 417 clipRecorder.addRoundedRectClip(layer->renderer()->style()->getRound edInnerBorderFor(LayoutRect(delta, layer->size())));
409 } 418 }
410 419
411 if (layer == localPaintingInfo.rootLayer) 420 if (layer == localPaintingInfo.rootLayer)
412 break; 421 break;
413 } 422 }
414 } 423 }
415 424
416 void LayerPainter::restoreClip(GraphicsContext* context, const LayoutRect& paint DirtyRect, const ClipRect& clipRect)
417 {
418 if (clipRect.rect() == paintDirtyRect && !clipRect.hasRadius())
419 return;
420 context->restore();
421 }
422
423 void LayerPainter::updatePaintingInfoForFragments(LayerFragments& fragments, con st LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags, 425 void LayerPainter::updatePaintingInfoForFragments(LayerFragments& fragments, con st LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags,
424 bool shouldPaintContent, const LayoutPoint* offsetFromRoot) 426 bool shouldPaintContent, const LayoutPoint* offsetFromRoot)
425 { 427 {
426 ASSERT(offsetFromRoot); 428 ASSERT(offsetFromRoot);
427 for (size_t i = 0; i < fragments.size(); ++i) { 429 for (size_t i = 0; i < fragments.size(); ++i) {
428 LayerFragment& fragment = fragments.at(i); 430 LayerFragment& fragment = fragments.at(i);
429 fragment.shouldPaintContent = shouldPaintContent; 431 fragment.shouldPaintContent = shouldPaintContent;
430 if (&m_renderLayer != localPaintingInfo.rootLayer || !(localPaintFlags & PaintLayerPaintingOverflowContents)) { 432 if (&m_renderLayer != localPaintingInfo.rootLayer || !(localPaintFlags & PaintLayerPaintingOverflowContents)) {
431 LayoutPoint newOffsetFromRoot = *offsetFromRoot + fragment.paginatio nOffset; 433 LayoutPoint newOffsetFromRoot = *offsetFromRoot + fragment.paginatio nOffset;
432 fragment.shouldPaintContent &= m_renderLayer.intersectsDamageRect(fr agment.layerBounds, fragment.backgroundRect.rect(), localPaintingInfo.rootLayer, &newOffsetFromRoot); 434 fragment.shouldPaintContent &= m_renderLayer.intersectsDamageRect(fr agment.layerBounds, fragment.backgroundRect.rect(), localPaintingInfo.rootLayer, &newOffsetFromRoot);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 // of the renderer already includes any sub-pixel offset. 508 // of the renderer already includes any sub-pixel offset.
507 if (compositingState == PaintsIntoOwnBacking) 509 if (compositingState == PaintsIntoOwnBacking)
508 return LayoutSize(); 510 return LayoutSize();
509 return subPixelAccumulation; 511 return subPixelAccumulation;
510 } 512 }
511 513
512 void LayerPainter::paintOverflowControlsForFragments(const LayerFragments& layer Fragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags) 514 void LayerPainter::paintOverflowControlsForFragments(const LayerFragments& layer Fragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags)
513 { 515 {
514 for (size_t i = 0; i < layerFragments.size(); ++i) { 516 for (size_t i = 0; i < layerFragments.size(); ++i) {
515 const LayerFragment& fragment = layerFragments.at(i); 517 const LayerFragment& fragment = layerFragments.at(i);
516 clipToRect(localPaintingInfo, context, fragment.backgroundRect, paintFla gs); 518
519 OwnPtr<ClipRecorder> clipRecorder;
520
521 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) {
522 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, Cl ipDisplayItem::LayerOverflowControls, fragment.backgroundRect));
523 applyRoundedRectClips(localPaintingInfo, context, fragment.backgroun dRect, paintFlags, *clipRecorder);
524 }
517 if (RenderLayerScrollableArea* scrollableArea = m_renderLayer.scrollable Area()) 525 if (RenderLayerScrollableArea* scrollableArea = m_renderLayer.scrollable Area())
518 scrollableArea->paintOverflowControls(context, roundedIntPoint(toPoi nt(fragment.layerBounds.location() - m_renderLayer.renderBoxLocation() + subPixe lAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, m_renderLayer.comp ositingState()))), pixelSnappedIntRect(fragment.backgroundRect.rect()), true); 526 scrollableArea->paintOverflowControls(context, roundedIntPoint(toPoi nt(fragment.layerBounds.location() - m_renderLayer.renderBoxLocation() + subPixe lAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, m_renderLayer.comp ositingState()))), pixelSnappedIntRect(fragment.backgroundRect.rect()), true);
519 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgrou ndRect);
520 } 527 }
521 } 528 }
522 529
523 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer) 530 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer)
524 { 531 {
525 RenderView* view = renderer->view(); 532 RenderView* view = renderer->view();
526 RenderLayerModelObject* prevBlock = renderer; 533 RenderLayerModelObject* prevBlock = renderer;
527 RenderBlock* containingBlock; 534 RenderBlock* containingBlock;
528 for (containingBlock = renderer->containingBlock(); 535 for (containingBlock = renderer->containingBlock();
529 containingBlock && containingBlock != view && containingBlock != ancesto rColumnsRenderer; 536 containingBlock && containingBlock != view && containingBlock != ancesto rColumnsRenderer;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 { 673 {
667 for (size_t i = 0; i < layerFragments.size(); ++i) { 674 for (size_t i = 0; i < layerFragments.size(); ++i) {
668 const LayerFragment& fragment = layerFragments.at(i); 675 const LayerFragment& fragment = layerFragments.at(i);
669 if (!fragment.shouldPaintContent) 676 if (!fragment.shouldPaintContent)
670 continue; 677 continue;
671 678
672 // Begin transparency layers lazily now that we know we have to paint so mething. 679 // Begin transparency layers lazily now that we know we have to paint so mething.
673 if (haveTransparency || m_renderLayer.paintsWithBlendMode()) 680 if (haveTransparency || m_renderLayer.paintsWithBlendMode())
674 beginTransparencyLayers(context, localPaintingInfo.rootLayer, transp arencyPaintDirtyRect, localPaintingInfo.subPixelAccumulation, localPaintingInfo. paintBehavior); 681 beginTransparencyLayers(context, localPaintingInfo.rootLayer, transp arencyPaintDirtyRect, localPaintingInfo.subPixelAccumulation, localPaintingInfo. paintBehavior);
675 682
676 if (localPaintingInfo.clipToDirtyRect) { 683 OwnPtr<ClipRecorder> clipRecorder;
677 // Paint our background first, before painting any child layers. 684
678 // Establish the clip used to paint our background. 685 if (localPaintingInfo.clipToDirtyRect && needsToClip(localPaintingInfo, fragment.backgroundRect)) {
679 clipToRect(localPaintingInfo, context, fragment.backgroundRect, pain tFlags, DoNotIncludeSelfForBorderRadius); // Background painting will handle cli pping to self. 686 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, Cl ipDisplayItem::LayerBackground, fragment.backgroundRect));
687 applyRoundedRectClips(localPaintingInfo, context, fragment.backgroun dRect, paintFlags, *clipRecorder);
680 } 688 }
681 689
682 // Paint the background. 690 // Paint the background.
683 // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info. 691 // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info.
684 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect .rect()), PaintPhaseBlockBackground, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer()); 692 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect .rect()), PaintPhaseBlockBackground, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
685 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState()))); 693 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState())));
686
687 if (localPaintingInfo.clipToDirtyRect)
688 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.back groundRect);
689 } 694 }
690 } 695 }
691 696
692 void LayerPainter::paintForegroundForFragments(const LayerFragments& layerFragme nts, GraphicsContext* context, 697 void LayerPainter::paintForegroundForFragments(const LayerFragments& layerFragme nts, GraphicsContext* context,
693 const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const L ayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, 698 const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const L ayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior,
694 RenderObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags p aintFlags) 699 RenderObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags p aintFlags)
695 { 700 {
696 // Begin transparency if we have something to paint. 701 // Begin transparency if we have something to paint.
697 if (haveTransparency || m_renderLayer.paintsWithBlendMode()) { 702 if (haveTransparency || m_renderLayer.paintsWithBlendMode()) {
698 for (size_t i = 0; i < layerFragments.size(); ++i) { 703 for (size_t i = 0; i < layerFragments.size(); ++i) {
699 const LayerFragment& fragment = layerFragments.at(i); 704 const LayerFragment& fragment = layerFragments.at(i);
700 if (fragment.shouldPaintContent && !fragment.foregroundRect.isEmpty( )) { 705 if (fragment.shouldPaintContent && !fragment.foregroundRect.isEmpty( )) {
701 beginTransparencyLayers(context, localPaintingInfo.rootLayer, tr ansparencyPaintDirtyRect, localPaintingInfo.subPixelAccumulation, localPaintingI nfo.paintBehavior); 706 beginTransparencyLayers(context, localPaintingInfo.rootLayer, tr ansparencyPaintDirtyRect, localPaintingInfo.subPixelAccumulation, localPaintingI nfo.paintBehavior);
702 break; 707 break;
703 } 708 }
704 } 709 }
705 } 710 }
706 711
707 // Optimize clipping for the single fragment case. 712 // Optimize clipping for the single fragment case.
708 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && layerFragments[0].shouldPaintContent && !layerFragments[0].foregroundRe ct.isEmpty(); 713 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && layerFragments[0].shouldPaintContent && !layerFragments[0].foregroundRe ct.isEmpty();
709 if (shouldClip) 714
710 clipToRect(localPaintingInfo, context, layerFragments[0].foregroundRect, paintFlags); 715 OwnPtr<ClipRecorder> clipRecorder;
716 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun dRect)) {
717 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, ClipDi splayItem::LayerForeground, layerFragments[0].foregroundRect));
718 applyRoundedRectClips(localPaintingInfo, context, layerFragments[0].fore groundRect, paintFlags, *clipRecorder);
719 }
711 720
712 // We have to loop through every fragment multiple times, since we have to i ssue paint invalidations in each specific phase in order for 721 // We have to loop through every fragment multiple times, since we have to i ssue paint invalidations in each specific phase in order for
713 // interleaving of the fragments to work properly. 722 // interleaving of the fragments to work properly.
714 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P aintPhaseChildBlockBackgrounds, layerFragments, 723 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P aintPhaseChildBlockBackgrounds, layerFragments,
715 context, localPaintingInfo, paintBehavior, paintingRootForRenderer, pain tFlags); 724 context, localPaintingInfo, paintBehavior, paintingRootForRenderer, pain tFlags);
716 725
717 if (!selectionOnly) { 726 if (!selectionOnly) {
718 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co ntext, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags); 727 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co ntext, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
719 paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragment s, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlag s); 728 paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragment s, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlag s);
720 paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragm ents, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintF lags); 729 paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragm ents, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintF lags);
721 } 730 }
722
723 if (shouldClip)
724 restoreClip(context, localPaintingInfo.paintDirtyRect, layerFragments[0] .foregroundRect);
725 } 731 }
726 732
727 void LayerPainter::paintForegroundForFragmentsWithPhase(PaintPhase phase, const LayerFragments& layerFragments, GraphicsContext* context, 733 void LayerPainter::paintForegroundForFragmentsWithPhase(PaintPhase phase, const LayerFragments& layerFragments, GraphicsContext* context,
728 const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, Ren derObject* paintingRootForRenderer, PaintLayerFlags paintFlags) 734 const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, Ren derObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
729 { 735 {
730 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() > 1; 736 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() > 1;
731 737
732 for (size_t i = 0; i < layerFragments.size(); ++i) { 738 for (size_t i = 0; i < layerFragments.size(); ++i) {
733 const LayerFragment& fragment = layerFragments.at(i); 739 const LayerFragment& fragment = layerFragments.at(i);
734 if (!fragment.shouldPaintContent || fragment.foregroundRect.isEmpty()) 740 if (!fragment.shouldPaintContent || fragment.foregroundRect.isEmpty())
735 continue; 741 continue;
736 742
737 if (shouldClip) 743 OwnPtr<ClipRecorder> clipRecorder;
738 clipToRect(localPaintingInfo, context, fragment.foregroundRect, pain tFlags); 744 if (shouldClip && needsToClip(localPaintingInfo, fragment.foregroundRect )) {
745 // Note: this method only clips when there is more than one fragment .
746 ClipDisplayItem::ClipType clipType = ClipDisplayItem::LayerFragmentF loat;
747 switch (phase) {
748 case PaintPhaseFloat:
749 break;
750 case PaintPhaseForeground:
751 clipType = ClipDisplayItem::LayerFragmentForeground;
752 break;
753 case PaintPhaseChildOutlines:
754 clipType = ClipDisplayItem::LayerFragmentChildOutline;
755 break;
756 case PaintPhaseSelection:
757 clipType = ClipDisplayItem::LayerFragmentSelection;
758 break;
759 case PaintPhaseChildBlockBackgrounds:
760 clipType = ClipDisplayItem::LayerFragmentChildBlockBackgrounds;
761 break;
762 default:
763 ASSERT_NOT_REACHED();
764 }
765
766 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, cl ipType, fragment.foregroundRect));
767 applyRoundedRectClips(localPaintingInfo, context, fragment.foregroun dRect, paintFlags, *clipRecorder);
768 }
739 769
740 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.foregroundRect .rect()), phase, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.ro otLayer->renderer()); 770 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.foregroundRect .rect()), phase, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.ro otLayer->renderer());
741 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState()))); 771 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState())));
742
743 if (shouldClip)
744 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.fore groundRect);
745 } 772 }
746 } 773 }
747 774
748 void LayerPainter::paintOutlineForFragments(const LayerFragments& layerFragments , GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, 775 void LayerPainter::paintOutlineForFragments(const LayerFragments& layerFragments , GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
749 PaintBehavior paintBehavior, RenderObject* paintingRootForRenderer, PaintLay erFlags paintFlags) 776 PaintBehavior paintBehavior, RenderObject* paintingRootForRenderer, PaintLay erFlags paintFlags)
750 { 777 {
751 for (size_t i = 0; i < layerFragments.size(); ++i) { 778 for (size_t i = 0; i < layerFragments.size(); ++i) {
752 const LayerFragment& fragment = layerFragments.at(i); 779 const LayerFragment& fragment = layerFragments.at(i);
753 if (fragment.outlineRect.isEmpty()) 780 if (fragment.outlineRect.isEmpty())
754 continue; 781 continue;
755 782
783 OwnPtr<ClipRecorder> clipRecorder;
784 if (needsToClip(localPaintingInfo, fragment.outlineRect)) {
785 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, Cl ipDisplayItem::LayerFragmentOutline, fragment.outlineRect));
786 applyRoundedRectClips(localPaintingInfo, context, fragment.outlineRe ct, paintFlags, *clipRecorder, DoNotIncludeSelfForBorderRadius);
787 }
788
756 // Paint our own outline 789 // Paint our own outline
757 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.outlineRect.re ct()), PaintPhaseSelfOutline, paintBehavior, paintingRootForRenderer, 0, localPa intingInfo.rootLayer->renderer()); 790 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.outlineRect.re ct()), PaintPhaseSelfOutline, paintBehavior, paintingRootForRenderer, 0, localPa intingInfo.rootLayer->renderer());
758 clipToRect(localPaintingInfo, context, fragment.outlineRect, paintFlags, DoNotIncludeSelfForBorderRadius);
759 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState()))); 791 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState())));
760 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.outlineR ect);
761 } 792 }
762 } 793 }
763 794
764 void LayerPainter::paintMaskForFragments(const LayerFragments& layerFragments, G raphicsContext* context, const LayerPaintingInfo& localPaintingInfo, 795 void LayerPainter::paintMaskForFragments(const LayerFragments& layerFragments, G raphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
765 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) 796 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
766 { 797 {
767 for (size_t i = 0; i < layerFragments.size(); ++i) { 798 for (size_t i = 0; i < layerFragments.size(); ++i) {
768 const LayerFragment& fragment = layerFragments.at(i); 799 const LayerFragment& fragment = layerFragments.at(i);
769 if (!fragment.shouldPaintContent) 800 if (!fragment.shouldPaintContent)
770 continue; 801 continue;
771 802
772 if (localPaintingInfo.clipToDirtyRect) 803 OwnPtr<ClipRecorder> clipRecorder;
773 clipToRect(localPaintingInfo, context, fragment.backgroundRect, pain tFlags, DoNotIncludeSelfForBorderRadius); // Mask painting will handle clipping to self. 804 if (localPaintingInfo.clipToDirtyRect && needsToClip(localPaintingInfo, fragment.backgroundRect)) {
805 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, Cl ipDisplayItem::LayerFragmentMask, fragment.backgroundRect));
806 applyRoundedRectClips(localPaintingInfo, context, fragment.backgroun dRect, paintFlags, *clipRecorder, DoNotIncludeSelfForBorderRadius); // Mask pain ting will handle clipping to self.
807 }
774 808
775 // Paint the mask. 809 // Paint the mask.
776 // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info. 810 // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info.
777 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect .rect()), PaintPhaseMask, PaintBehaviorNormal, paintingRootForRenderer, 0, local PaintingInfo.rootLayer->renderer()); 811 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect .rect()), PaintPhaseMask, PaintBehaviorNormal, paintingRootForRenderer, 0, local PaintingInfo.rootLayer->renderer());
778 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState()))); 812 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState())));
779
780 if (localPaintingInfo.clipToDirtyRect)
781 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.back groundRect);
782 } 813 }
783 } 814 }
784 815
785 void LayerPainter::paintChildClippingMaskForFragments(const LayerFragments& laye rFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo , 816 void LayerPainter::paintChildClippingMaskForFragments(const LayerFragments& laye rFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo ,
786 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) 817 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
787 { 818 {
788 for (size_t i = 0; i < layerFragments.size(); ++i) { 819 for (size_t i = 0; i < layerFragments.size(); ++i) {
789 const LayerFragment& fragment = layerFragments.at(i); 820 const LayerFragment& fragment = layerFragments.at(i);
790 if (!fragment.shouldPaintContent) 821 if (!fragment.shouldPaintContent)
791 continue; 822 continue;
792 823
793 if (localPaintingInfo.clipToDirtyRect) 824 OwnPtr<ClipRecorder> clipRecorder;
794 clipToRect(localPaintingInfo, context, fragment.foregroundRect, pain tFlags, IncludeSelfForBorderRadius); // Child clipping mask painting will handle clipping to self. 825 if (localPaintingInfo.clipToDirtyRect && needsToClip(localPaintingInfo, fragment.foregroundRect)) {
826 clipRecorder = adoptPtr(new ClipRecorder(&m_renderLayer, context, Cl ipDisplayItem::LayerFragmentClippingMask, fragment.foregroundRect));
827 applyRoundedRectClips(localPaintingInfo, context, fragment.foregroun dRect, paintFlags, *clipRecorder, IncludeSelfForBorderRadius); // Child clipping mask painting will handle clipping to self.
828 }
795 829
796 // Paint the the clipped mask. 830 // Paint the the clipped mask.
797 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect .rect()), PaintPhaseClippingMask, PaintBehaviorNormal, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer()); 831 PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect .rect()), PaintPhaseClippingMask, PaintBehaviorNormal, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
798 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState()))); 832 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds. location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(lo calPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState())));
799
800 if (localPaintingInfo.clipToDirtyRect)
801 restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.fore groundRect);
802 } 833 }
803 } 834 }
804 835
805 void LayerPainter::paintOverlayScrollbars(GraphicsContext* context, const Layout Rect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot) 836 void LayerPainter::paintOverlayScrollbars(GraphicsContext* context, const Layout Rect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot)
806 { 837 {
807 if (!m_renderLayer.containsDirtyOverlayScrollbars()) 838 if (!m_renderLayer.containsDirtyOverlayScrollbars())
808 return; 839 return;
809 840
810 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot); 841 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
811 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 842 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
(...skipping 22 matching lines...) Expand all
834 m_renderLayer.enclosingPaginationLayer()->convertToLayerCoords(paint ingInfo.rootLayer, offsetOfPaginationLayerFromRoot); 865 m_renderLayer.enclosingPaginationLayer()->convertToLayerCoords(paint ingInfo.rootLayer, offsetOfPaginationLayerFromRoot);
835 866
836 ClipRectsContext clipRectsContext(m_renderLayer.enclosingPaginationL ayer(), (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Paintin gClipRects, IgnoreOverlayScrollbarSize); 867 ClipRectsContext clipRectsContext(m_renderLayer.enclosingPaginationL ayer(), (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Paintin gClipRects, IgnoreOverlayScrollbarSize);
837 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()) == IgnoreOverflowClip) 868 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()) == IgnoreOverflowClip)
838 clipRectsContext.setIgnoreOverflowClip(); 869 clipRectsContext.setIgnoreOverflowClip();
839 LayoutRect parentClipRect = m_renderLayer.clipper().backgroundClipRe ct(clipRectsContext).rect(); 870 LayoutRect parentClipRect = m_renderLayer.clipper().backgroundClipRe ct(clipRectsContext).rect();
840 parentClipRect.moveBy(fragment.paginationOffset + offsetOfPagination LayerFromRoot); 871 parentClipRect.moveBy(fragment.paginationOffset + offsetOfPagination LayerFromRoot);
841 clipRect.intersect(parentClipRect); 872 clipRect.intersect(parentClipRect);
842 } 873 }
843 874
844 LayerPainter(*m_renderLayer.parent()).clipToRect(paintingInfo, context, clipRect, paintFlags); 875 OwnPtr<ClipRecorder> clipRecorder;
876 if (needsToClip(paintingInfo, clipRect)) {
877 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.parent(), con text, ClipDisplayItem::LayerFragmentParent, clipRect));
878 LayerPainter(*m_renderLayer.parent()).applyRoundedRectClips(painting Info, context, clipRect, paintFlags, *clipRecorder, DoNotIncludeSelfForBorderRad ius); // Child clipping mask painting will handle clipping to self.
879 }
880
845 paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragmen t.paginationOffset); 881 paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragmen t.paginationOffset);
846 LayerPainter(*m_renderLayer.parent()).restoreClip(context, paintingInfo. paintDirtyRect, clipRect);
847 } 882 }
848 } 883 }
849 884
850 } // namespace blink 885 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/ViewDisplayList.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698