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

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

Issue 2194273002: Fix border radius on composited children. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Switch to using the layer's offsetFromLayoutObject Created 4 years 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/PaintLayerPainter.cpp
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
index 7c500884885c0045d20b7a4ca37ac354ba8e12ab..662930434c38d209cc0ee28aa51968e4d271221a 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
@@ -374,7 +374,8 @@ PaintResult PaintLayerPainter::paintLayerContents(
// scrolling contents and scrollbars.
if (m_paintLayer.layoutObject()->hasClipPath() &&
(!m_paintLayer.needsCompositedScrolling() ||
- (paintFlags & PaintLayerPaintingChildClippingMaskPhase))) {
+ (paintFlags & (PaintLayerPaintingChildClippingMaskPhase |
+ PaintLayerPaintingAncestorClippingMaskPhase)))) {
paintingInfo.ancestorHasClipPathClipping = true;
LayoutRect referenceBox(m_paintLayer.boxForClipPath());
@@ -430,19 +431,34 @@ PaintResult PaintLayerPainter::paintLayerContents(
// TODO(trchen): We haven't decided how to handle visual fragmentation with
chrishtr 2016/12/02 19:21:47 This comment belongs down by line 446.
Stephen Chennney 2016/12/07 21:39:38 Done.
// SPv2. Related thread
// https://groups.google.com/a/chromium.org/forum/#!topic/graphics-dev/81XuWFf-mxM
+ PaintLayer* paintLayerForFragmentsAndClip = &m_paintLayer;
+ LayoutPoint offsetFromRootForFragmentsAndClip = offsetFromRoot;
+ if (paintFlags & PaintLayerPaintingAncestorClippingMaskPhase) {
+ // Compute fragments and their clips with respect to the clipping
+ // container, and then convert them back to this layer's space.
+ // We need a new offset from root.
+ paintLayerForFragmentsAndClip =
+ m_paintLayer.clippingContainer()->enclosingLayer();
+ paintLayerForFragmentsAndClip->convertToLayerCoords(
chrishtr 2016/12/02 19:21:47 You can't map from an ancestor to a descendant Pai
Stephen Chennney 2016/12/07 21:39:38 Done.
+ m_paintLayer.root(), offsetFromRootForFragmentsAndClip);
+ }
+
if (fragmentPolicy == ForceSingleFragment ||
- RuntimeEnabledFeatures::slimmingPaintV2Enabled())
- m_paintLayer.appendSingleFragmentIgnoringPagination(
+ RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
+ paintLayerForFragmentsAndClip->appendSingleFragmentIgnoringPagination(
layerFragments, localPaintingInfo.rootLayer,
localPaintingInfo.paintDirtyRect, cacheSlot,
- IgnoreOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot,
+ IgnoreOverlayScrollbarSize, respectOverflowClip,
+ &offsetFromRootForFragmentsAndClip,
localPaintingInfo.subPixelAccumulation);
- else
- m_paintLayer.collectFragments(layerFragments, localPaintingInfo.rootLayer,
- localPaintingInfo.paintDirtyRect, cacheSlot,
- IgnoreOverlayScrollbarSize,
- respectOverflowClip, &offsetFromRoot,
- localPaintingInfo.subPixelAccumulation);
+ } else {
+ paintLayerForFragmentsAndClip->collectFragments(
+ layerFragments, localPaintingInfo.rootLayer,
+ localPaintingInfo.paintDirtyRect, cacheSlot,
+ IgnoreOverlayScrollbarSize, respectOverflowClip,
+ &offsetFromRootForFragmentsAndClip,
+ localPaintingInfo.subPixelAccumulation);
+ }
if (shouldPaintContent) {
// TODO(wangxianzhu): This is for old slow scrolling. Implement similar
@@ -546,7 +562,8 @@ PaintResult PaintLayerPainter::paintLayerContents(
shouldPaintContent && m_paintLayer.layoutObject()->hasMask() &&
!selectionOnly;
bool shouldPaintClippingMask =
- (paintFlags & PaintLayerPaintingChildClippingMaskPhase) &&
+ (paintFlags & (PaintLayerPaintingChildClippingMaskPhase |
+ PaintLayerPaintingAncestorClippingMaskPhase)) &&
shouldPaintContent && !selectionOnly;
if (shouldPaintMask)
@@ -625,6 +642,7 @@ PaintResult PaintLayerPainter::paintLayerWithTransform(
object->container() == view && view->pageLogicalHeight();
PaintLayer* paginationLayer = m_paintLayer.enclosingPaginationLayer();
PaintLayerFragments fragments;
+
chrishtr 2016/12/02 19:21:47 Super nit: spurious.
Stephen Chennney 2016/12/07 21:39:38 Done.
// TODO(crbug.com/619094): Figure out the correct behaviour for fixed position
// objects in paged media with vertical writing modes.
if (isFixedPosObjectInPagedMedia && view->isHorizontalWritingMode()) {
@@ -881,6 +899,22 @@ void PaintLayerPainter::paintOverflowControlsForFragments(
}
}
+void adjustPaintOffsetForAncestorClippingMask(
+ PaintLayer& layer, LayoutPoint& paintOffset)
+{
+ // Adjust the paint offset to reflect the fact that the fragment is
+ // positioned for the clipping container object.
+ LayoutPoint clippersOffsetToRoot;
+ PaintLayer* paintLayerForMask =
+ layer.clippingContainer()->enclosingLayer();
+ paintLayerForMask->convertToLayerCoords(layer.root(),
chrishtr 2016/12/02 19:21:47 This duplicates line 442 I think?
+ clippersOffsetToRoot);
+ LayoutPoint paintersOffsetToRoot;
+ layer.convertToLayerCoords(layer.root(), paintersOffsetToRoot);
+
+ paintOffset.move(paintersOffsetToRoot - clippersOffsetToRoot);
+}
+
void PaintLayerPainter::paintFragmentWithPhase(
PaintPhase phase,
const PaintLayerFragment& fragment,
@@ -909,9 +943,21 @@ void PaintLayerPainter::paintFragmentWithPhase(
break;
}
- clipRecorder.emplace(context, *m_paintLayer.layoutObject(), clipType,
- clipRect, &paintingInfo, fragment.paginationOffset,
- paintFlags, clippingRule);
+ // When painting the clipping mask for a composited child, we pass
+ // the clipping container object as the layoutObject to provide the clip.
+ // The recorder assumes the fragment is positioned in that objects's
+ // layer coordinates, so we also convert that.
+ if (paintFlags & PaintLayerPaintingAncestorClippingMaskPhase) {
+ clipRecorder.emplace(
+ context, *(toLayoutBoxModelObject(m_paintLayer.clippingContainer())),
chrishtr 2016/12/02 19:21:47 Might be easier to read if you make a local variab
+ clipType, clipRect, &paintingInfo,
+ fragment.paginationOffset,
+ paintFlags, clippingRule);
+ } else {
+ clipRecorder.emplace(context, *m_paintLayer.layoutObject(), clipType,
+ clipRect, &paintingInfo, fragment.paginationOffset,
+ paintFlags, clippingRule);
+ }
}
LayoutRect newCullRect(clipRect.rect());
@@ -945,6 +991,9 @@ void PaintLayerPainter::paintFragmentWithPhase(
paintingInfo.getGlobalPaintFlags(), paintFlags,
paintingInfo.rootLayer->layoutObject());
+ if (paintFlags & PaintLayerPaintingAncestorClippingMaskPhase)
+ adjustPaintOffsetForAncestorClippingMask(m_paintLayer, paintOffset);
+
m_paintLayer.layoutObject()->paint(paintInfo, paintOffset);
}

Powered by Google App Engine
This is Rietveld 408576698