OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/paint/PaintLayerPainter.h" | 5 #include "core/paint/PaintLayerPainter.h" |
6 | 6 |
7 #include "core/frame/LocalFrame.h" | 7 #include "core/frame/LocalFrame.h" |
8 #include "core/layout/LayoutInline.h" | 8 #include "core/layout/LayoutInline.h" |
9 #include "core/layout/LayoutView.h" | 9 #include "core/layout/LayoutView.h" |
10 #include "core/paint/ClipPathClipper.h" | 10 #include "core/paint/ClipPathClipper.h" |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 | 257 |
258 if (paintingInfo.ancestorHasClipPathClipping && m_paintLayer.layoutObject()-
>isPositioned()) | 258 if (paintingInfo.ancestorHasClipPathClipping && m_paintLayer.layoutObject()-
>isPositioned()) |
259 UseCounter::count(m_paintLayer.layoutObject()->document(), UseCounter::C
lipPathOfPositionedElement); | 259 UseCounter::count(m_paintLayer.layoutObject()->document(), UseCounter::C
lipPathOfPositionedElement); |
260 | 260 |
261 // These helpers output clip and compositing operations using a RAII pattern
. Stack-allocated-varibles are destructed in the reverse order of construction, | 261 // These helpers output clip and compositing operations using a RAII pattern
. Stack-allocated-varibles are destructed in the reverse order of construction, |
262 // so they are nested properly. | 262 // so they are nested properly. |
263 Optional<ClipPathClipper> clipPathClipper; | 263 Optional<ClipPathClipper> clipPathClipper; |
264 // Clip-path, like border radius, must not be applied to the contents of a c
omposited-scrolling container. | 264 // Clip-path, like border radius, must not be applied to the contents of a c
omposited-scrolling container. |
265 // It must, however, still be applied to the mask layer, so that the composi
tor can properly mask the | 265 // It must, however, still be applied to the mask layer, so that the composi
tor can properly mask the |
266 // scrolling contents and scrollbars. | 266 // scrolling contents and scrollbars. |
267 if (m_paintLayer.layoutObject()->hasClipPath() && (!m_paintLayer.needsCompos
itedScrolling() || (paintFlags & PaintLayerPaintingChildClippingMaskPhase))) { | 267 if (m_paintLayer.layoutObject()->hasClipPath() && (!m_paintLayer.needsCompos
itedScrolling() || (paintFlags & (PaintLayerPaintingChildClippingMaskPhase | Pai
ntLayerPaintingAncestorClippingMaskPhase)))) { |
268 paintingInfo.ancestorHasClipPathClipping = true; | 268 paintingInfo.ancestorHasClipPathClipping = true; |
269 | 269 |
270 LayoutRect referenceBox(m_paintLayer.boxForClipPath()); | 270 LayoutRect referenceBox(m_paintLayer.boxForClipPath()); |
271 // Note that this isn't going to work correctly if crossing a column bou
ndary. The reference box should be | 271 // Note that this isn't going to work correctly if crossing a column bou
ndary. The reference box should be |
272 // determined per-fragment, and hence this ought to be performed after f
ragmentation. | 272 // determined per-fragment, and hence this ought to be performed after f
ragmentation. |
273 if (m_paintLayer.enclosingPaginationLayer()) | 273 if (m_paintLayer.enclosingPaginationLayer()) |
274 m_paintLayer.convertFromFlowThreadToVisualBoundingBoxInAncestor(pain
tingInfo.rootLayer, referenceBox); | 274 m_paintLayer.convertFromFlowThreadToVisualBoundingBoxInAncestor(pain
tingInfo.rootLayer, referenceBox); |
275 else | 275 else |
276 referenceBox.moveBy(offsetFromRoot); | 276 referenceBox.moveBy(offsetFromRoot); |
277 clipPathClipper.emplace( | 277 clipPathClipper.emplace( |
(...skipping 15 matching lines...) Expand all Loading... |
293 | 293 |
294 PaintLayerPaintingInfo localPaintingInfo(paintingInfo); | 294 PaintLayerPaintingInfo localPaintingInfo(paintingInfo); |
295 localPaintingInfo.subPixelAccumulation = subpixelAccumulation; | 295 localPaintingInfo.subPixelAccumulation = subpixelAccumulation; |
296 | 296 |
297 PaintLayerFragments layerFragments; | 297 PaintLayerFragments layerFragments; |
298 if (shouldPaintContent || shouldPaintSelfOutline || isPaintingOverlayScrollb
ars) { | 298 if (shouldPaintContent || shouldPaintSelfOutline || isPaintingOverlayScrollb
ars) { |
299 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment. | 299 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment. |
300 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; | 300 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; |
301 // TODO(trchen): We haven't decided how to handle visual fragmentation w
ith SPv2. | 301 // TODO(trchen): We haven't decided how to handle visual fragmentation w
ith SPv2. |
302 // Related thread https://groups.google.com/a/chromium.org/forum/#!topic
/graphics-dev/81XuWFf-mxM | 302 // Related thread https://groups.google.com/a/chromium.org/forum/#!topic
/graphics-dev/81XuWFf-mxM |
303 if (fragmentPolicy == ForceSingleFragment || RuntimeEnabledFeatures::sli
mmingPaintV2Enabled()) | 303 if (fragmentPolicy == ForceSingleFragment || RuntimeEnabledFeatures::sli
mmingPaintV2Enabled()) { |
304 m_paintLayer.appendSingleFragmentIgnoringPagination(layerFragments,
localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect, cacheSlot, Ignore
OverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.su
bPixelAccumulation); | 304 m_paintLayer.appendSingleFragmentIgnoringPagination(layerFragments,
localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect, |
305 else | 305 cacheSlot, IgnoreOverlayScrollbarSize, respectOverflowClip, pain
tFlags & PaintLayerPaintingAncestorClippingMaskPhase, &offsetFromRoot, localPain
tingInfo.subPixelAccumulation); |
306 m_paintLayer.collectFragments(layerFragments, localPaintingInfo.root
Layer, localPaintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize,
respectOverflowClip, &offsetFromRoot, localPaintingInfo.subPixelAccumulation); | 306 } else { |
| 307 m_paintLayer.collectFragments(layerFragments, localPaintingInfo.root
Layer, localPaintingInfo.paintDirtyRect, |
| 308 cacheSlot, IgnoreOverlayScrollbarSize, respectOverflowClip, pain
tFlags & PaintLayerPaintingAncestorClippingMaskPhase, |
| 309 &offsetFromRoot, localPaintingInfo.subPixelAccumulation); |
| 310 } |
307 | 311 |
308 // TODO(trchen): Needs to adjust cull rect between transform spaces. htt
ps://crbug.com/593596 | 312 // TODO(trchen): Needs to adjust cull rect between transform spaces. htt
ps://crbug.com/593596 |
309 // Disables layer culling for SPv2 for now because the space of the cull
rect doesn't match | 313 // Disables layer culling for SPv2 for now because the space of the cull
rect doesn't match |
310 // the space we paint in. Clipping will still be done by clip nodes, so
this won't cause | 314 // the space we paint in. Clipping will still be done by clip nodes, so
this won't cause |
311 // rendering issues, only performance. | 315 // rendering issues, only performance. |
312 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | 316 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
313 layerFragments[0].backgroundRect = LayoutRect(LayoutRect::infiniteIn
tRect()); | 317 layerFragments[0].backgroundRect = LayoutRect(LayoutRect::infiniteIn
tRect()); |
314 layerFragments[0].foregroundRect = LayoutRect(LayoutRect::infiniteIn
tRect()); | 318 layerFragments[0].foregroundRect = LayoutRect(LayoutRect::infiniteIn
tRect()); |
315 } | 319 } |
316 | 320 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 if (shouldPaintNormalFlowAndPosZOrderLists) { | 374 if (shouldPaintNormalFlowAndPosZOrderLists) { |
371 if (paintChildren(NormalFlowChildren | PositiveZOrderChildren, conte
xt, paintingInfo, paintFlags) == MayBeClippedByPaintDirtyRect) | 375 if (paintChildren(NormalFlowChildren | PositiveZOrderChildren, conte
xt, paintingInfo, paintFlags) == MayBeClippedByPaintDirtyRect) |
372 result = MayBeClippedByPaintDirtyRect; | 376 result = MayBeClippedByPaintDirtyRect; |
373 } | 377 } |
374 | 378 |
375 if (shouldPaintOverlayScrollbars) | 379 if (shouldPaintOverlayScrollbars) |
376 paintOverflowControlsForFragments(layerFragments, context, localPain
tingInfo, paintFlags); | 380 paintOverflowControlsForFragments(layerFragments, context, localPain
tingInfo, paintFlags); |
377 } // FilterPainter block | 381 } // FilterPainter block |
378 | 382 |
379 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase)
&& shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn
ly; | 383 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase)
&& shouldPaintContent && m_paintLayer.layoutObject()->hasMask() && !selectionOn
ly; |
380 bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClipping
MaskPhase) && shouldPaintContent && !selectionOnly; | 384 bool shouldPaintClippingMask = (paintFlags & (PaintLayerPaintingChildClippin
gMaskPhase | PaintLayerPaintingAncestorClippingMaskPhase)) && shouldPaintContent
&& !selectionOnly; |
381 | 385 |
382 if (shouldPaintMask) | 386 if (shouldPaintMask) |
383 paintMaskForFragments(layerFragments, context, localPaintingInfo, paintF
lags); | 387 paintMaskForFragments(layerFragments, context, localPaintingInfo, paintF
lags); |
384 if (shouldPaintClippingMask) { | 388 if (shouldPaintClippingMask) { |
385 // Paint the border radius mask for the fragments. | 389 // Paint the border radius mask for the fragments. |
386 paintChildClippingMaskForFragments(layerFragments, context, localPaintin
gInfo, paintFlags); | 390 paintChildClippingMaskForFragments(layerFragments, context, localPaintin
gInfo, paintFlags); |
387 } | 391 } |
388 | 392 |
389 if (subsequenceRecorder) | 393 if (subsequenceRecorder) |
390 m_paintLayer.setPreviousPaintResult(result); | 394 m_paintLayer.setPreviousPaintResult(result); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 } else if (paginationLayer) { | 470 } else if (paginationLayer) { |
467 // FIXME: This is a mess. Look closely at this code and the code in Laye
r and fix any | 471 // FIXME: This is a mess. Look closely at this code and the code in Laye
r and fix any |
468 // issues in it & refactor to make it obvious from code structure what i
t does and that it's | 472 // issues in it & refactor to make it obvious from code structure what i
t does and that it's |
469 // correct. | 473 // correct. |
470 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; | 474 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; |
471 ShouldRespectOverflowClipType respectOverflowClip = shouldRespectOverflo
wClip(paintFlags, m_paintLayer.layoutObject()); | 475 ShouldRespectOverflowClipType respectOverflowClip = shouldRespectOverflo
wClip(paintFlags, m_paintLayer.layoutObject()); |
472 // Calculate the transformed bounding box in the current coordinate spac
e, to figure out | 476 // Calculate the transformed bounding box in the current coordinate spac
e, to figure out |
473 // which fragmentainers (e.g. columns) we need to visit. | 477 // which fragmentainers (e.g. columns) we need to visit. |
474 LayoutRect transformedExtent = PaintLayer::transparencyClipBox(&m_paintL
ayer, paginationLayer, PaintLayer::PaintingTransparencyClipBox, PaintLayer::Root
OfTransparencyClipBox, paintingInfo.subPixelAccumulation, paintingInfo.getGlobal
PaintFlags()); | 478 LayoutRect transformedExtent = PaintLayer::transparencyClipBox(&m_paintL
ayer, paginationLayer, PaintLayer::PaintingTransparencyClipBox, PaintLayer::Root
OfTransparencyClipBox, paintingInfo.subPixelAccumulation, paintingInfo.getGlobal
PaintFlags()); |
475 // FIXME: we don't check if paginationLayer is within paintingInfo.rootL
ayer here. | 479 // FIXME: we don't check if paginationLayer is within paintingInfo.rootL
ayer here. |
476 paginationLayer->collectFragments(fragments, paintingInfo.rootLayer, pai
ntingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflow
Clip, 0, paintingInfo.subPixelAccumulation, &transformedExtent); | 480 paginationLayer->collectFragments(fragments, paintingInfo.rootLayer, pai
ntingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflow
Clip, false, 0, paintingInfo.subPixelAccumulation, &transformedExtent); |
477 } else { | 481 } else { |
478 // We don't need to collect any fragments in the regular way here. We ha
ve already | 482 // We don't need to collect any fragments in the regular way here. We ha
ve already |
479 // calculated a clip rectangle for the ancestry if it was needed, and cl
ipping this | 483 // calculated a clip rectangle for the ancestry if it was needed, and cl
ipping this |
480 // layer is something that can be done further down the path, when the t
ransform has | 484 // layer is something that can be done further down the path, when the t
ransform has |
481 // been applied. | 485 // been applied. |
482 PaintLayerFragment fragment; | 486 PaintLayerFragment fragment; |
483 fragment.backgroundRect = paintingInfo.paintDirtyRect; | 487 fragment.backgroundRect = paintingInfo.paintDirtyRect; |
484 fragments.append(fragment); | 488 fragments.append(fragment); |
485 } | 489 } |
486 | 490 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 switch (phase) { | 644 switch (phase) { |
641 case PaintPhaseSelfBlockBackgroundOnly: // Background painting will hand
le clipping to self. | 645 case PaintPhaseSelfBlockBackgroundOnly: // Background painting will hand
le clipping to self. |
642 case PaintPhaseSelfOutlineOnly: | 646 case PaintPhaseSelfOutlineOnly: |
643 case PaintPhaseMask: // Mask painting will handle clipping to self. | 647 case PaintPhaseMask: // Mask painting will handle clipping to self. |
644 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; | 648 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; |
645 break; | 649 break; |
646 default: | 650 default: |
647 clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius; | 651 clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius; |
648 break; | 652 break; |
649 } | 653 } |
650 | |
651 clipRecorder.emplace(context, *m_paintLayer.layoutObject(), clipType, cl
ipRect, &paintingInfo, fragment.paginationOffset, paintFlags, clippingRule); | 654 clipRecorder.emplace(context, *m_paintLayer.layoutObject(), clipType, cl
ipRect, &paintingInfo, fragment.paginationOffset, paintFlags, clippingRule); |
652 } | 655 } |
653 | 656 |
654 LayoutRect newCullRect(clipRect.rect()); | 657 LayoutRect newCullRect(clipRect.rect()); |
655 Optional<ScrollRecorder> scrollRecorder; | 658 Optional<ScrollRecorder> scrollRecorder; |
656 LayoutPoint paintOffset = -m_paintLayer.layoutBoxLocation(); | 659 LayoutPoint paintOffset = -m_paintLayer.layoutBoxLocation(); |
657 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { | 660 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
658 const ObjectPaintProperties* objectPaintProperties = m_paintLayer.layout
Object()->objectPaintProperties(); | 661 const ObjectPaintProperties* objectPaintProperties = m_paintLayer.layout
Object()->objectPaintProperties(); |
659 ASSERT(objectPaintProperties && objectPaintProperties->localBorderBoxPro
perties()); | 662 ASSERT(objectPaintProperties && objectPaintProperties->localBorderBoxPro
perties()); |
660 paintOffset += toSize(objectPaintProperties->localBorderBoxProperties()-
>paintOffset); | 663 paintOffset += toSize(objectPaintProperties->localBorderBoxProperties()-
>paintOffset); |
661 } else { | 664 } else { |
662 paintOffset += toSize(fragment.layerBounds.location()); | 665 paintOffset += toSize(fragment.layerBounds.location()); |
663 if (!paintingInfo.scrollOffsetAccumulation.isZero()) { | 666 if (!paintingInfo.scrollOffsetAccumulation.isZero()) { |
664 // As a descendant of the root layer, m_paintLayer's painting is not
controlled by the ScrollRecorders | 667 // As a descendant of the root layer, m_paintLayer's painting is not
controlled by the ScrollRecorders |
665 // created by BlockPainter of the ancestor layers up to the root lay
er, so we need to issue ScrollRecorder | 668 // created by BlockPainter of the ancestor layers up to the root lay
er, so we need to issue ScrollRecorder |
666 // for this layer seperately, with the scroll offset accumulated fro
m the root layer to the parent of this | 669 // for this layer seperately, with the scroll offset accumulated fro
m the root layer to the parent of this |
667 // layer, to get the same result as ScrollRecorder in BlockPainter. | 670 // layer, to get the same result as ScrollRecorder in BlockPainter. |
668 paintOffset += paintingInfo.scrollOffsetAccumulation; | 671 paintOffset += paintingInfo.scrollOffsetAccumulation; |
669 | 672 |
670 newCullRect.move(paintingInfo.scrollOffsetAccumulation); | 673 newCullRect.move(paintingInfo.scrollOffsetAccumulation); |
671 scrollRecorder.emplace(context, *m_paintLayer.layoutObject(), phase,
paintingInfo.scrollOffsetAccumulation); | 674 scrollRecorder.emplace(context, *m_paintLayer.layoutObject(), phase,
paintingInfo.scrollOffsetAccumulation); |
672 } | 675 } |
673 } | 676 } |
674 PaintInfo paintInfo(context, pixelSnappedIntRect(newCullRect), phase, | 677 PaintInfo paintInfo(context, pixelSnappedIntRect(newCullRect), phase, |
675 paintingInfo.getGlobalPaintFlags(), paintFlags, paintingInfo.rootLayer->
layoutObject()); | 678 paintingInfo.getGlobalPaintFlags(), paintFlags, paintingInfo.rootLayer->
layoutObject()); |
676 | 679 |
| 680 // TODO(schenney): This is the wrong object for painting AncestorClippingMas
k. |
677 m_paintLayer.layoutObject()->paint(paintInfo, paintOffset); | 681 m_paintLayer.layoutObject()->paint(paintInfo, paintOffset); |
678 } | 682 } |
679 | 683 |
680 void PaintLayerPainter::paintBackgroundForFragments(const PaintLayerFragments& l
ayerFragments, | 684 void PaintLayerPainter::paintBackgroundForFragments(const PaintLayerFragments& l
ayerFragments, |
681 GraphicsContext& context, const LayoutRect& transparencyPaintDirtyRect, | 685 GraphicsContext& context, const LayoutRect& transparencyPaintDirtyRect, |
682 const PaintLayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags) | 686 const PaintLayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags) |
683 { | 687 { |
684 Optional<DisplayItemCacheSkipper> cacheSkipper; | 688 Optional<DisplayItemCacheSkipper> cacheSkipper; |
685 if (layerFragments.size() > 1) | 689 if (layerFragments.size() > 1) |
686 cacheSkipper.emplace(context); | 690 cacheSkipper.emplace(context); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 if (!m_paintLayer.containsDirtyOverlayScrollbars()) | 798 if (!m_paintLayer.containsDirtyOverlayScrollbars()) |
795 return; | 799 return; |
796 | 800 |
797 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), paintFlags, LayoutSize()); | 801 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), paintFlags, LayoutSize()); |
798 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); | 802 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); |
799 | 803 |
800 m_paintLayer.setContainsDirtyOverlayScrollbars(false); | 804 m_paintLayer.setContainsDirtyOverlayScrollbars(false); |
801 } | 805 } |
802 | 806 |
803 } // namespace blink | 807 } // namespace blink |
OLD | NEW |