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

Unified Diff: third_party/WebKit/Source/core/paint/BoxPainter.cpp

Issue 2068723002: Paint local attachment backgrounds into composited scrolling contents layer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Improve opaque layer detection and fix non-composited border painting bug in layout tests. Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/paint/BoxPainter.cpp
diff --git a/third_party/WebKit/Source/core/paint/BoxPainter.cpp b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
index b7e005a61ba2af7da17a4dfb21571ceabfc4df5e..20f9cec6c7439874e126d9c143066caac866e4b6 100644
--- a/third_party/WebKit/Source/core/paint/BoxPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
@@ -46,14 +46,25 @@ void BoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOffse
void BoxPainter::paintBoxDecorationBackground(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
- LayoutRect paintRect = m_layoutBox.borderBoxRect();
+ LayoutRect paintRect;
+ if ((paintInfo.paintFlags() & PaintLayerPaintingCompositingBackgroundPhase)
+ || !m_layoutBox.scrollsOverflow()) {
+ paintRect = m_layoutBox.borderBoxRect();
+ } else {
+ // Need to include overflow when drawing into the scrolling contents layer.
+ paintRect = m_layoutBox.layoutOverflowRect();
+ paintRect.move(-m_layoutBox.scrolledContentOffset());
+ }
+
paintRect.moveBy(paintOffset);
paintBoxDecorationBackgroundWithRect(paintInfo, paintOffset, paintRect);
}
-LayoutRect BoxPainter::boundsForDrawingRecorder(const LayoutPoint& adjustedPaintOffset)
+LayoutRect BoxPainter::boundsForDrawingRecorder(const PaintInfo& paintInfo, const LayoutPoint& adjustedPaintOffset)
{
- LayoutRect bounds = m_layoutBox.selfVisualOverflowRect();
+ LayoutRect bounds = paintInfo.paintFlags() & PaintLayerPaintingCompositingBackgroundPhase
+ ? m_layoutBox.selfVisualOverflowRect()
+ : m_layoutBox.layoutOverflowRect();
bounds.moveBy(adjustedPaintOffset);
return bounds;
}
@@ -69,6 +80,8 @@ bool bleedAvoidanceIsClipping(BackgroundBleedAvoidance bleedAvoidance)
void BoxPainter::paintBoxDecorationBackgroundWithRect(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, const LayoutRect& paintRect)
{
+ bool paintBackgroundOnly = !(paintInfo.paintFlags() & PaintLayerPaintingCompositingBackgroundPhase)
+ && (paintInfo.paintFlags() & PaintLayerPaintingBackgroundOntoForeground);
const ComputedStyle& style = m_layoutBox.styleRef();
// FIXME: For now we don't have notification on media buffered range change from media player
@@ -80,17 +93,20 @@ void BoxPainter::paintBoxDecorationBackgroundWithRect(const PaintInfo& paintInfo
if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_layoutBox, DisplayItem::BoxDecorationBackground))
return;
- LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutBox, DisplayItem::BoxDecorationBackground, boundsForDrawingRecorder(paintOffset));
+ LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutBox, DisplayItem::BoxDecorationBackground, boundsForDrawingRecorder(paintInfo, paintOffset));
BoxDecorationData boxDecorationData(m_layoutBox);
// FIXME: Should eventually give the theme control over whether the box shadow should paint, since controls could have
// custom shadows of their own.
- if (!m_layoutBox.boxShadowShouldBeAppliedToBackground(boxDecorationData.bleedAvoidance))
+ if (!paintBackgroundOnly
Stephen Chennney 2016/07/27 22:33:36 You can have 1 if and put both of the remaining bl
flackr 2016/07/28 14:39:20 Done.
+ && !m_layoutBox.boxShadowShouldBeAppliedToBackground(boxDecorationData.bleedAvoidance)) {
paintBoxShadow(paintInfo, paintRect, style, Normal);
+ }
GraphicsContextStateSaver stateSaver(paintInfo.context, false);
- if (bleedAvoidanceIsClipping(boxDecorationData.bleedAvoidance)) {
+ if (!paintBackgroundOnly
Stephen Chennney 2016/07/27 22:33:36 i.e unify this if with the one above.
flackr 2016/07/28 14:39:20 Done.
+ && bleedAvoidanceIsClipping(boxDecorationData.bleedAvoidance)) {
stateSaver.save();
FloatRoundedRect border = style.getRoundedBorderFor(paintRect);
paintInfo.context.clipRoundedRect(border);
@@ -104,19 +120,26 @@ void BoxPainter::paintBoxDecorationBackgroundWithRect(const PaintInfo& paintInfo
IntRect snappedPaintRect(pixelSnappedIntRect(paintRect));
ThemePainter& themePainter = LayoutTheme::theme().painter();
bool themePainted = boxDecorationData.hasAppearance && !themePainter.paint(m_layoutBox, paintInfo, snappedPaintRect);
- if (!themePainted) {
+ bool shouldPaintBackground = !themePainted
+ && (paintInfo.paintFlags() & PaintLayerPaintingCompositingForegroundPhase
+ || !(paintInfo.paintFlags() & PaintLayerPaintingBackgroundOntoForeground));
+ if (shouldPaintBackground) {
paintBackground(paintInfo, paintRect, boxDecorationData.backgroundColor, boxDecorationData.bleedAvoidance);
if (boxDecorationData.hasAppearance)
themePainter.paintDecorations(m_layoutBox, paintInfo, snappedPaintRect);
}
- paintBoxShadow(paintInfo, paintRect, style, Inset);
+
+ if (!paintBackgroundOnly)
Stephen Chennney 2016/07/27 22:33:36 And here too.
flackr 2016/07/28 14:39:20 Done.
+ paintBoxShadow(paintInfo, paintRect, style, Inset);
// The theme will tell us whether or not we should also paint the CSS border.
- if (boxDecorationData.hasBorderDecoration
+ if (!paintBackgroundOnly
+ && boxDecorationData.hasBorderDecoration
&& (!boxDecorationData.hasAppearance || (!themePainted && LayoutTheme::theme().painter().paintBorderOnly(m_layoutBox, paintInfo, snappedPaintRect)))
- && !(m_layoutBox.isTable() && toLayoutTable(&m_layoutBox)->collapseBorders()))
+ && !(m_layoutBox.isTable() && toLayoutTable(&m_layoutBox)->collapseBorders())) {
paintBorder(m_layoutBox, paintInfo, paintRect, style, boxDecorationData.bleedAvoidance);
+ }
if (boxDecorationData.bleedAvoidance == BackgroundBleedClipLayer)
paintInfo.context.endLayer();
@@ -477,6 +500,7 @@ void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
return;
}
+ bool avoidBorder = paintInfo.paintFlags() & PaintLayerPaintingCompositingBackgroundPhase;
Optional<RoundedInnerRectClipper> clipToBorder;
if (info.isRoundedFill) {
FloatRoundedRect border = info.isBorderFill
@@ -487,10 +511,10 @@ void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
if (bgLayer.clip() == ContentFillBox) {
border = obj.style()->getRoundedInnerBorderFor(LayoutRect(border.rect()),
LayoutRectOutsets(
- -(obj.paddingTop() + obj.borderTop()),
- -(obj.paddingRight() + obj.borderRight()),
- -(obj.paddingBottom() + obj.borderBottom()),
- -(obj.paddingLeft() + obj.borderLeft())),
+ -(obj.paddingTop() + (avoidBorder ? obj.borderTop() : 0)),
+ -(obj.paddingRight() + (avoidBorder ? obj.borderRight() : 0)),
+ -(obj.paddingBottom() + (avoidBorder ? obj.borderBottom() : 0)),
+ -(obj.paddingLeft() + (avoidBorder ? obj.borderLeft() : 0))),
info.includeLeftEdge, info.includeRightEdge);
} else if (bgLayer.clip() == PaddingFillBox) {
border = obj.style()->getRoundedInnerBorderFor(LayoutRect(border.rect()), info.includeLeftEdge, info.includeRightEdge);
@@ -499,14 +523,14 @@ void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
clipToBorder.emplace(obj, paintInfo, rect, border, ApplyToContext);
}
- int bLeft = info.includeLeftEdge ? obj.borderLeft() : 0;
- int bRight = info.includeRightEdge ? obj.borderRight() : 0;
+ int bLeft = info.includeLeftEdge && avoidBorder ? obj.borderLeft() : 0;
+ int bRight = info.includeRightEdge && avoidBorder ? obj.borderRight() : 0;
LayoutUnit pLeft = info.includeLeftEdge ? obj.paddingLeft() : LayoutUnit();
LayoutUnit pRight = info.includeRightEdge ? obj.paddingRight() : LayoutUnit();
GraphicsContextStateSaver clipWithScrollingStateSaver(context, info.isClippedWithLocalScrolling);
LayoutRect scrolledPaintRect = rect;
- if (info.isClippedWithLocalScrolling) {
+ if (info.isClippedWithLocalScrolling && paintInfo.paintFlags() & PaintLayerPaintingCompositingBackgroundPhase) {
// Clip to the overflow area.
const LayoutBox& thisBox = toLayoutBox(obj);
// TODO(chrishtr): this should be pixel-snapped.
@@ -516,7 +540,7 @@ void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
IntSize offset = thisBox.scrolledContentOffset();
scrolledPaintRect.move(-offset);
scrolledPaintRect.setWidth(bLeft + thisBox.scrollWidth() + bRight);
- scrolledPaintRect.setHeight(thisBox.borderTop() + thisBox.scrollHeight() + thisBox.borderBottom());
+ scrolledPaintRect.setHeight((avoidBorder ? thisBox.borderTop() : 0) + thisBox.scrollHeight() + (avoidBorder ? thisBox.borderBottom() : 0));
}
GraphicsContextStateSaver backgroundClipStateSaver(context, false);
@@ -531,9 +555,9 @@ void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
// Clip to the padding or content boxes as necessary.
bool includePadding = bgLayer.clip() == ContentFillBox;
LayoutRect clipRect(scrolledPaintRect.x() + bLeft + (includePadding ? pLeft : LayoutUnit()),
- scrolledPaintRect.y() + obj.borderTop() + (includePadding ? obj.paddingTop() : LayoutUnit()),
+ scrolledPaintRect.y() + (avoidBorder ? obj.borderTop() : 0) + (includePadding ? obj.paddingTop() : LayoutUnit()),
scrolledPaintRect.width() - bLeft - bRight - (includePadding ? pLeft + pRight : LayoutUnit()),
- scrolledPaintRect.height() - obj.borderTop() - obj.borderBottom() - (includePadding ? obj.paddingTop() + obj.paddingBottom() : LayoutUnit()));
+ scrolledPaintRect.height() - (avoidBorder ? obj.borderTop() + obj.borderBottom() : 0) - (includePadding ? obj.paddingTop() + obj.paddingBottom() : LayoutUnit()));
backgroundClipStateSaver.save();
// TODO(chrishtr): this should be pixel-snapped.
context.clip(FloatRect(clipRect));
@@ -575,7 +599,7 @@ void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
if (info.shouldPaintImage) {
if (!geometry) {
geometry.emplace();
- geometry->calculate(obj, paintInfo.paintContainer(), paintInfo.getGlobalPaintFlags(), bgLayer, scrolledPaintRect);
+ geometry->calculate(obj, paintInfo.paintContainer(), paintInfo.getGlobalPaintFlags(), bgLayer, scrolledPaintRect, paintInfo.paintFlags() & PaintLayerPaintingCompositingBackgroundPhase);
} else {
// The geometry was calculated in paintFastBottomLayer().
DCHECK(info.isBottomLayer && info.isBorderFill && !info.isClippedWithLocalScrolling);

Powered by Google App Engine
This is Rietveld 408576698