Changeset 260808 in webkit
- Timestamp:
- Apr 27, 2020 11:22:55 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r260807 r260808 1 2020-04-27 Simon Fraser <simon.fraser@apple.com> 2 3 Do correct clipping of composited replaced elements with border-radius 4 https://bugs.webkit.org/show_bug.cgi?id=211114 5 6 Reviewed by Zalan Bujtas. 7 8 This test clips out everything but the rounded padding area. None of the red 9 canvas should show. 10 11 * compositing/clipping/border-radius-on-webgl-expected.html: Added. 12 * compositing/clipping/border-radius-on-webgl.html: Added. 13 1 14 2020-04-27 Devin Rousso <drousso@apple.com> 2 15 -
trunk/Source/WebCore/ChangeLog
r260800 r260808 1 2020-04-27 Simon Fraser <simon.fraser@apple.com> 2 3 Do correct clipping of composited replaced elements with border-radius 4 https://bugs.webkit.org/show_bug.cgi?id=211114 5 6 Reviewed by Zalan Bujtas. 7 8 For replaced elements with composited content (video, WebGL), RenderLayerBacking 9 incorrectly used the rounded inner border rect to clip the contents. This doesn't match 10 painted replaced elements, which clip to the inside of the padding box. 11 12 Fix by implementing RenderReplaced::roundedContentBoxRect() and calling it from compositing 13 code. Also add a helper to get the rounded border box rect, and call it in various places. 14 15 Test: compositing/clipping/border-radius-on-webgl.html 16 17 * rendering/RenderBox.cpp: 18 (WebCore::RenderBox::roundedBorderBoxRect const): 19 * rendering/RenderBox.h: 20 * rendering/RenderLayerBacking.cpp: 21 (WebCore::RenderLayerBacking::updateBackdropFiltersGeometry): 22 (WebCore::RenderLayerBacking::updateConfiguration): 23 (WebCore::RenderLayerBacking::updateGeometry): 24 (WebCore::RenderLayerBacking::updateContentsRects): 25 (WebCore::RenderLayerBacking::resetContentsRect): 26 (WebCore::RenderLayerBacking::updateChildClippingStrategy): 27 (WebCore::RenderLayerBacking::updateDirectlyCompositedBackgroundImage): 28 (WebCore::RenderLayerBacking::updateImageContents): 29 (WebCore::backgroundRectForBox): 30 * rendering/RenderLayerBacking.h: 31 * rendering/RenderReplaced.cpp: 32 (WebCore::RenderReplaced::roundedContentBoxRect const): 33 * rendering/RenderReplaced.h: 34 1 35 2020-04-27 Said Abou-Hallawa <sabouhallawa@apple.com> 2 36 -
trunk/Source/WebCore/rendering/RenderBox.cpp
r260482 r260808 673 673 } 674 674 675 RoundedRect RenderBox::roundedBorderBoxRect() const 676 { 677 return style().getRoundedInnerBorderFor(borderBoxRect()); 678 } 679 675 680 LayoutRect RenderBox::paddingBoxRect() const 676 681 { -
trunk/Source/WebCore/rendering/RenderBox.h
r260482 r260808 155 155 156 156 WEBCORE_EXPORT RoundedRect::Radii borderRadii() const; 157 RoundedRect roundedBorderBoxRect() const; 157 158 158 159 // The content area of the box (excludes padding - and intrinsic padding for table cells, etc... - and border). -
trunk/Source/WebCore/rendering/RenderLayerBacking.cpp
r260774 r260808 637 637 return; 638 638 639 auto& render er= downcast<RenderBox>(this->renderer());640 LayoutRect boxRect = render er.borderBoxRect();641 if (render er.hasClip())642 boxRect.intersect(render er.clipRect(LayoutPoint(), nullptr));639 auto& renderBox = downcast<RenderBox>(this->renderer()); 640 LayoutRect boxRect = renderBox.borderBoxRect(); 641 if (renderBox.hasClip()) 642 boxRect.intersect(renderBox.clipRect(LayoutPoint(), nullptr)); 643 643 boxRect.move(contentOffsetInCompositingLayer()); 644 644 645 645 FloatRoundedRect backdropFiltersRect; 646 if (render er.style().hasBorderRadius() && !renderer.hasClip())647 backdropFiltersRect = render er.style().getRoundedInnerBorderFor(boxRect).pixelSnappedRoundedRectForPainting(deviceScaleFactor());646 if (renderBox.style().hasBorderRadius() && !renderBox.hasClip()) 647 backdropFiltersRect = renderBox.roundedBorderBoxRect().pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 648 648 else 649 649 backdropFiltersRect = FloatRoundedRect(snapRectToDevicePixels(boxRect, deviceScaleFactor())); … … 880 880 if (usesCompositedScrolling) { 881 881 // If it's scrollable, it has to be a box. 882 auto& renderBox = downcast<RenderBox>(renderer()); 883 FloatRoundedRect contentsClippingRect = renderer().style().getRoundedInnerBorderFor(renderBox.borderBoxRect()).pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 882 FloatRoundedRect contentsClippingRect = downcast<RenderBox>(renderer()).roundedBorderBoxRect().pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 884 883 needsDescendantsClippingLayer = contentsClippingRect.isRounded(); 885 884 } else … … 949 948 auto* mediaElement = downcast<HTMLMediaElement>(renderer().element()); 950 949 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer(), GraphicsLayer::ContentsLayerPurpose::Media); 951 // Requires layout. 952 resetContentsRect(); 950 updateContentsRects(); 953 951 } 954 952 #endif … … 1272 1270 1273 1271 if ((renderer().style().clipPath() || renderer().style().hasBorderRadius()) && !m_childClippingMaskLayer) { 1274 LayoutRect boxRect({ }, renderBox.size()); 1275 FloatRoundedRect contentsClippingRect = renderer().style().getRoundedInnerBorderFor(boxRect).pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 1272 FloatRoundedRect contentsClippingRect = renderBox.roundedBorderBoxRect().pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 1276 1273 contentsClippingRect.move(LayoutSize(-clipLayer->offsetFromRenderer())); 1277 1274 clipLayer->setMasksToBoundsRect(contentsClippingRect); … … 1586 1583 } 1587 1584 1585 void RenderLayerBacking::updateContentsRects() 1586 { 1587 m_graphicsLayer->setContentsRect(snapRectToDevicePixels(contentsBox(), deviceScaleFactor())); 1588 1589 if (is<RenderReplaced>(renderer())) { 1590 FloatRoundedRect contentsClippingRect = downcast<RenderReplaced>(renderer()).roundedContentBoxRect().pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 1591 contentsClippingRect.move(contentOffsetInCompositingLayer()); 1592 m_graphicsLayer->setContentsClippingRect(contentsClippingRect); 1593 } 1594 } 1595 1588 1596 void RenderLayerBacking::resetContentsRect() 1589 1597 { 1590 m_graphicsLayer->setContentsRect(snapRectToDevicePixels(contentsBox(), deviceScaleFactor())); 1591 1592 if (is<RenderBox>(renderer())) { 1593 LayoutRect boxRect(LayoutPoint(), downcast<RenderBox>(renderer()).size()); 1594 boxRect.move(contentOffsetInCompositingLayer()); 1595 FloatRoundedRect contentsClippingRect = renderer().style().getRoundedInnerBorderFor(boxRect).pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 1596 m_graphicsLayer->setContentsClippingRect(contentsClippingRect); 1597 } 1598 1598 updateContentsRects(); 1599 1599 m_graphicsLayer->setContentsTileSize(IntSize()); 1600 1600 m_graphicsLayer->setContentsTilePhase(IntSize()); … … 2041 2041 if (is<RenderBox>(renderer()) && (renderer().style().clipPath() || renderer().style().hasBorderRadius())) { 2042 2042 auto* clipLayer = clippingLayer(); 2043 LayoutRect boxRect(LayoutPoint(), downcast<RenderBox>(renderer()).size()); 2044 FloatRoundedRect contentsClippingRect = renderer().style().getRoundedInnerBorderFor(boxRect).pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 2043 FloatRoundedRect contentsClippingRect = downcast<RenderBox>(renderer()).roundedBorderBoxRect().pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 2045 2044 contentsClippingRect.move(LayoutSize(-clipLayer->offsetFromRenderer())); 2046 2045 // Note that we have to set this rounded rect again during the geometry update (clipLayer->offsetFromRenderer() may be stale here). … … 2324 2323 auto& style = renderer().style(); 2325 2324 if (!contentsInfo.isSimpleContainer() || !style.hasBackgroundImage()) { 2326 m_graphicsLayer->setContentsToImage( 0);2325 m_graphicsLayer->setContentsToImage(nullptr); 2327 2326 return; 2328 2327 } … … 2688 2687 return; 2689 2688 2690 // This is a no-op if the layer doesn't have an inner layer for the image. 2691 m_graphicsLayer->setContentsRect(snapRectToDevicePixels(contentsBox(), deviceScaleFactor())); 2692 2693 LayoutRect boxRect(LayoutPoint(), imageRenderer.size()); 2694 boxRect.move(contentOffsetInCompositingLayer()); 2695 FloatRoundedRect contentsClippingRect = renderer().style().getRoundedInnerBorderFor(boxRect).pixelSnappedRoundedRectForPainting(deviceScaleFactor()); 2696 m_graphicsLayer->setContentsClippingRect(contentsClippingRect); 2697 2689 updateContentsRects(); 2698 2690 m_graphicsLayer->setContentsToImage(image); 2699 2691 … … 2761 2753 2762 2754 ASSERT_NOT_REACHED(); 2763 return LayoutRect();2755 return { }; 2764 2756 } 2765 2757 -
trunk/Source/WebCore/rendering/RenderLayerBacking.h
r260403 r260808 364 364 365 365 void resetContentsRect(); 366 void updateContentsRects(); 366 367 367 368 bool isPaintDestinationForDescendantLayers(RenderLayer::PaintedContentRequest&) const; -
trunk/Source/WebCore/rendering/RenderReplaced.cpp
r260367 r260808 427 427 } 428 428 429 RoundedRect RenderReplaced::roundedContentBoxRect() const 430 { 431 return style().getRoundedInnerBorderFor(borderBoxRect(), 432 borderTop() + paddingTop(), borderBottom() + paddingBottom(), 433 borderLeft() + paddingLeft(), borderRight() + paddingRight()); 434 } 435 429 436 void RenderReplaced::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const 430 437 { -
trunk/Source/WebCore/rendering/RenderReplaced.h
r256196 r260808 42 42 43 43 LayoutSize intrinsicSize() const final { return m_intrinsicSize; } 44 45 RoundedRect roundedContentBoxRect() const; 44 46 45 47 protected:
Note: See TracChangeset
for help on using the changeset viewer.