OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/paint/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/paint/FilterPainter.h" | 10 #include "core/paint/FilterPainter.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 if (m_renderLayer.parent()) { | 97 if (m_renderLayer.parent()) { |
98 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlag
s & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, Ignore
OverlayScrollbarSize); | 98 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlag
s & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, Ignore
OverlayScrollbarSize); |
99 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer())
== IgnoreOverflowClip) | 99 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer())
== IgnoreOverflowClip) |
100 clipRectsContext.setIgnoreOverflowClip(); | 100 clipRectsContext.setIgnoreOverflowClip(); |
101 clipRect = m_renderLayer.clipper().backgroundClipRect(clipRectsConte
xt); | 101 clipRect = m_renderLayer.clipper().backgroundClipRect(clipRectsConte
xt); |
102 clipRect.intersect(paintingInfo.paintDirtyRect); | 102 clipRect.intersect(paintingInfo.paintDirtyRect); |
103 | 103 |
104 if (needsToClip(paintingInfo, clipRect)) { | 104 if (needsToClip(paintingInfo, clipRect)) { |
105 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.parent()-
>renderer(), context, DisplayItem::ClipLayerParent, clipRect)); | 105 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.parent()-
>renderer(), context, DisplayItem::ClipLayerParent, clipRect)); |
106 if (clipRect.hasRadius()) | 106 if (clipRect.hasRadius()) |
107 applyRoundedRectClips(*m_renderLayer.parent(), paintingInfo,
context, paintFlags, *clipRecorder); | 107 applyRoundedRectClips(*m_renderLayer.parent(), paintingInfo,
context, LayoutPoint(), paintFlags, *clipRecorder); |
108 } | 108 } |
109 } | 109 } |
110 | 110 |
111 paintLayerByApplyingTransform(context, paintingInfo, paintFlags); | 111 paintLayerByApplyingTransform(context, paintingInfo, paintFlags); |
112 | 112 |
113 return; | 113 return; |
114 } | 114 } |
115 | 115 |
116 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); | 116 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); |
117 } | 117 } |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 } | 368 } |
369 | 369 |
370 return false; | 370 return false; |
371 } | 371 } |
372 | 372 |
373 bool LayerPainter::needsToClip(const LayerPaintingInfo& localPaintingInfo, const
ClipRect& clipRect) | 373 bool LayerPainter::needsToClip(const LayerPaintingInfo& localPaintingInfo, const
ClipRect& clipRect) |
374 { | 374 { |
375 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa
dius(); | 375 return clipRect.rect() != localPaintingInfo.paintDirtyRect || clipRect.hasRa
dius(); |
376 } | 376 } |
377 | 377 |
378 void LayerPainter::applyRoundedRectClips(RenderLayer& renderLayer, const LayerPa
intingInfo& localPaintingInfo, GraphicsContext* context, | 378 void LayerPainter::applyRoundedRectClips(RenderLayer& renderLayer, const LayerPa
intingInfo& localPaintingInfo, GraphicsContext* context, const LayoutPoint& frag
mentOffset, PaintLayerFlags paintFlags, ClipRecorder& clipRecorder, BorderRadius
ClippingRule rule) |
379 PaintLayerFlags paintFlags, ClipRecorder& clipRecorder, BorderRadiusClipping
Rule rule) | |
380 { | 379 { |
381 // 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 | 380 // 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 |
382 // any layers with overflow. The condition for being able to apply these cli
ps is that the overflow object be in our | 381 // any layers with overflow. The condition for being able to apply these cli
ps is that the overflow object be in our |
383 // containing block chain so we check that also. | 382 // containing block chain so we check that also. |
384 for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? &renderLayer
: renderLayer.parent(); layer; layer = layer->parent()) { | 383 for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? &renderLayer
: renderLayer.parent(); layer; layer = layer->parent()) { |
385 // Composited scrolling layers handle border-radius clip in the composit
or via a mask layer. We do not | 384 // Composited scrolling layers handle border-radius clip in the composit
or via a mask layer. We do not |
386 // want to apply a border-radius clip to the layer contents itself, beca
use that would require re-rastering | 385 // want to apply a border-radius clip to the layer contents itself, beca
use that would require re-rastering |
387 // every frame to update the clip. We only want to make sure that the ma
sk layer is properly clipped so | 386 // every frame to update the clip. We only want to make sure that the ma
sk layer is properly clipped so |
388 // that it can in turn clip the scrolled contents in the compositor. | 387 // that it can in turn clip the scrolled contents in the compositor. |
389 if (layer->needsCompositedScrolling() && !(paintFlags & PaintLayerPainti
ngChildClippingMaskPhase)) | 388 if (layer->needsCompositedScrolling() && !(paintFlags & PaintLayerPainti
ngChildClippingMaskPhase)) |
390 break; | 389 break; |
391 | 390 |
392 if (layer->renderer()->hasOverflowClip() && layer->renderer()->style()->
hasBorderRadius() && inContainingBlockChain(&renderLayer, layer)) { | 391 if (layer->renderer()->hasOverflowClip() && layer->renderer()->style()->
hasBorderRadius() && inContainingBlockChain(&renderLayer, layer)) { |
393 LayoutPoint delta; | 392 LayoutPoint delta(fragmentOffset); |
394 layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta); | 393 layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta); |
395 clipRecorder.addRoundedRectClip(layer->renderer()->style()->getRound
edInnerBorderFor(LayoutRect(delta, layer->size()))); | 394 clipRecorder.addRoundedRectClip(layer->renderer()->style()->getRound
edInnerBorderFor(LayoutRect(delta, layer->size()))); |
396 } | 395 } |
397 | 396 |
398 if (layer == localPaintingInfo.rootLayer) | 397 if (layer == localPaintingInfo.rootLayer) |
399 break; | 398 break; |
400 } | 399 } |
401 } | 400 } |
402 | 401 |
403 bool LayerPainter::atLeastOneFragmentIntersectsDamageRect(LayerFragments& fragme
nts, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags
, const LayoutPoint& offsetFromRoot) | 402 bool LayerPainter::atLeastOneFragmentIntersectsDamageRect(LayerFragments& fragme
nts, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags
, const LayoutPoint& offsetFromRoot) |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 void LayerPainter::paintOverflowControlsForFragments(const LayerFragments& layer
Fragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
PaintLayerFlags paintFlags) | 497 void LayerPainter::paintOverflowControlsForFragments(const LayerFragments& layer
Fragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
PaintLayerFlags paintFlags) |
499 { | 498 { |
500 for (size_t i = 0; i < layerFragments.size(); ++i) { | 499 for (size_t i = 0; i < layerFragments.size(); ++i) { |
501 const LayerFragment& fragment = layerFragments.at(i); | 500 const LayerFragment& fragment = layerFragments.at(i); |
502 | 501 |
503 OwnPtr<ClipRecorder> clipRecorder; | 502 OwnPtr<ClipRecorder> clipRecorder; |
504 | 503 |
505 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) { | 504 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) { |
506 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), c
ontext, DisplayItem::ClipLayerOverflowControls, fragment.backgroundRect)); | 505 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), c
ontext, DisplayItem::ClipLayerOverflowControls, fragment.backgroundRect)); |
507 if (fragment.backgroundRect.hasRadius()) | 506 if (fragment.backgroundRect.hasRadius()) |
508 applyRoundedRectClips(m_renderLayer, localPaintingInfo, context,
paintFlags, *clipRecorder); | 507 applyRoundedRectClips(m_renderLayer, localPaintingInfo, context,
fragment.paginationOffset, paintFlags, *clipRecorder); |
509 } | 508 } |
510 if (RenderLayerScrollableArea* scrollableArea = m_renderLayer.scrollable
Area()) | 509 if (RenderLayerScrollableArea* scrollableArea = m_renderLayer.scrollable
Area()) |
511 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); | 510 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); |
512 } | 511 } |
513 } | 512 } |
514 | 513 |
515 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende
rer, RenderBox* ancestorColumnsRenderer) | 514 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende
rer, RenderBox* ancestorColumnsRenderer) |
516 { | 515 { |
517 RenderView* view = renderer->view(); | 516 RenderView* view = renderer->view(); |
518 RenderLayerModelObject* prevBlock = renderer; | 517 RenderLayerModelObject* prevBlock = renderer; |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 break; | 686 break; |
688 case PaintPhaseClippingMask: | 687 case PaintPhaseClippingMask: |
689 clipType = DisplayItem::ClipLayerFragmentClippingMask; | 688 clipType = DisplayItem::ClipLayerFragmentClippingMask; |
690 break; | 689 break; |
691 default: | 690 default: |
692 ASSERT_NOT_REACHED(); | 691 ASSERT_NOT_REACHED(); |
693 } | 692 } |
694 | 693 |
695 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), conte
xt, clipType, clipRect)); | 694 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), conte
xt, clipType, clipRect)); |
696 if (clipRect.hasRadius()) | 695 if (clipRect.hasRadius()) |
697 applyRoundedRectClips(m_renderLayer, paintingInfo, context, paintFla
gs, *clipRecorder, clippingRule); | 696 applyRoundedRectClips(m_renderLayer, paintingInfo, context, fragment
.paginationOffset, paintFlags, *clipRecorder, clippingRule); |
698 } | 697 } |
699 | 698 |
700 PaintInfo paintInfo(context, pixelSnappedIntRect(clipRect.rect()), phase, pa
intBehavior, paintingRootForRenderer, 0, paintingInfo.rootLayer->renderer()); | 699 PaintInfo paintInfo(context, pixelSnappedIntRect(clipRect.rect()), phase, pa
intBehavior, paintingRootForRenderer, 0, paintingInfo.rootLayer->renderer()); |
701 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds.loca
tion() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(painti
ngInfo.subPixelAccumulation, m_renderLayer.compositingState()))); | 700 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds.loca
tion() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(painti
ngInfo.subPixelAccumulation, m_renderLayer.compositingState()))); |
702 } | 701 } |
703 | 702 |
704 void LayerPainter::paintBackgroundForFragments(const LayerFragments& layerFragme
nts, GraphicsContext* context, | 703 void LayerPainter::paintBackgroundForFragments(const LayerFragments& layerFragme
nts, GraphicsContext* context, |
705 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local
PaintingInfo, PaintBehavior paintBehavior, | 704 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local
PaintingInfo, PaintBehavior paintBehavior, |
706 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) | 705 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) |
707 { | 706 { |
708 for (const auto& fragment: layerFragments) { | 707 for (const auto& fragment: layerFragments) { |
709 paintFragmentWithPhase(PaintPhaseBlockBackground, fragment, context, fra
gment.backgroundRect, localPaintingInfo, paintBehavior, paintingRootForRenderer,
paintFlags, HasNotClipped); | 708 paintFragmentWithPhase(PaintPhaseBlockBackground, fragment, context, fra
gment.backgroundRect, localPaintingInfo, paintBehavior, paintingRootForRenderer,
paintFlags, HasNotClipped); |
710 } | 709 } |
711 } | 710 } |
712 | 711 |
713 void LayerPainter::paintForegroundForFragments(const LayerFragments& layerFragme
nts, GraphicsContext* context, | 712 void LayerPainter::paintForegroundForFragments(const LayerFragments& layerFragme
nts, GraphicsContext* context, |
714 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local
PaintingInfo, PaintBehavior paintBehavior, | 713 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local
PaintingInfo, PaintBehavior paintBehavior, |
715 RenderObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags p
aintFlags) | 714 RenderObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags p
aintFlags) |
716 { | 715 { |
717 // Optimize clipping for the single fragment case. | 716 // Optimize clipping for the single fragment case. |
718 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size()
== 1 && !layerFragments[0].foregroundRect.isEmpty(); | 717 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size()
== 1 && !layerFragments[0].foregroundRect.isEmpty(); |
719 ClipState clipState = HasNotClipped; | 718 ClipState clipState = HasNotClipped; |
720 OwnPtr<ClipRecorder> clipRecorder; | 719 OwnPtr<ClipRecorder> clipRecorder; |
721 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun
dRect)) { | 720 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun
dRect)) { |
722 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), conte
xt, DisplayItem::ClipLayerForeground, layerFragments[0].foregroundRect)); | 721 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), conte
xt, DisplayItem::ClipLayerForeground, layerFragments[0].foregroundRect)); |
723 if (layerFragments[0].foregroundRect.hasRadius()) | 722 if (layerFragments[0].foregroundRect.hasRadius()) |
724 applyRoundedRectClips(m_renderLayer, localPaintingInfo, context, pai
ntFlags, *clipRecorder); | 723 applyRoundedRectClips(m_renderLayer, localPaintingInfo, context, lay
erFragments[0].paginationOffset, paintFlags, *clipRecorder); |
725 clipState = HasClipped; | 724 clipState = HasClipped; |
726 } | 725 } |
727 | 726 |
728 // We have to loop through every fragment multiple times, since we have to i
ssue paint invalidations in each specific phase in order for | 727 // We have to loop through every fragment multiple times, since we have to i
ssue paint invalidations in each specific phase in order for |
729 // interleaving of the fragments to work properly. | 728 // interleaving of the fragments to work properly. |
730 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P
aintPhaseChildBlockBackgrounds, layerFragments, | 729 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P
aintPhaseChildBlockBackgrounds, layerFragments, |
731 context, localPaintingInfo, paintBehavior, paintingRootForRenderer, pain
tFlags, clipState); | 730 context, localPaintingInfo, paintBehavior, paintingRootForRenderer, pain
tFlags, clipState); |
732 | 731 |
733 if (!selectionOnly) { | 732 if (!selectionOnly) { |
734 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co
ntext, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, cl
ipState); | 733 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co
ntext, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, cl
ipState); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 | 809 |
811 OwnPtr<ClipRecorder> clipRecorder; | 810 OwnPtr<ClipRecorder> clipRecorder; |
812 if (needsToClip(paintingInfo, clipRect)) | 811 if (needsToClip(paintingInfo, clipRect)) |
813 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), c
ontext, DisplayItem::ClipLayerFragmentParent, clipRect)); | 812 clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), c
ontext, DisplayItem::ClipLayerFragmentParent, clipRect)); |
814 | 813 |
815 paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragmen
t.paginationOffset); | 814 paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragmen
t.paginationOffset); |
816 } | 815 } |
817 } | 816 } |
818 | 817 |
819 } // namespace blink | 818 } // namespace blink |
OLD | NEW |