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

Unified Diff: Source/core/rendering/RenderLayerBacking.cpp

Issue 16688004: Large canvas does not honor containing div's border radius (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 6 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
« no previous file with comments | « Source/core/rendering/RenderLayerBacking.h ('k') | Source/core/rendering/RenderLayerCompositor.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderLayerBacking.cpp
diff --git a/Source/core/rendering/RenderLayerBacking.cpp b/Source/core/rendering/RenderLayerBacking.cpp
index a5a84c2b7768a81120c75fe9546c869b246ec6c4..760b32b824124e33a548dc51526bf43ef6ba5b51 100644
--- a/Source/core/rendering/RenderLayerBacking.cpp
+++ b/Source/core/rendering/RenderLayerBacking.cpp
@@ -82,6 +82,14 @@ static inline bool isAcceleratedCanvas(RenderObject* renderer)
return false;
}
+static inline bool shouldClipRoundedBorders(RenderObject* renderer)
+{
+ return renderer->style()->hasBorderRadius()
+ && (isAcceleratedCanvas(renderer)
jamesr 2013/07/03 21:34:01 i'm not sure i understand the purpose of these che
rosca 2013/07/04 07:51:51 This is the first case, where the content being cl
+ || (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing())
+ || renderer->isVideo());
+}
+
// Get the scrolling coordinator in a way that works inside RenderLayerBacking's destructor.
static ScrollingCoordinator* scrollingCoordinatorFromLayer(RenderLayer* layer)
{
@@ -168,6 +176,11 @@ void RenderLayerBacking::updateDebugIndicators(bool showBorder, bool showRepaint
m_maskLayer->setShowRepaintCounter(showRepaintCounter);
}
+ if (m_borderRadiusLayer) {
+ m_borderRadiusLayer->setShowDebugBorder(showBorder);
+ m_borderRadiusLayer->setShowRepaintCounter(showRepaintCounter);
+ }
+
if (m_layerForHorizontalScrollbar)
m_layerForHorizontalScrollbar->setShowDebugBorder(showBorder);
@@ -220,6 +233,7 @@ void RenderLayerBacking::destroyGraphicsLayers()
m_backgroundLayer = nullptr;
m_childContainmentLayer = nullptr;
m_maskLayer = nullptr;
+ m_borderRadiusLayer = nullptr;
m_scrollingLayer = nullptr;
m_scrollingContentsLayer = nullptr;
@@ -431,6 +445,9 @@ bool RenderLayerBacking::updateGraphicsLayerConfiguration()
if (updateMaskLayer(renderer->hasMask()))
m_graphicsLayer->setMaskLayer(m_maskLayer.get());
+ if (updateBorderRadiusLayer(shouldClipRoundedBorders(renderer)))
+ m_graphicsLayer->setBorderRadiusLayer(m_borderRadiusLayer.get());
+
if (m_owningLayer->hasReflection()) {
if (m_owningLayer->reflectionLayer()->backing()) {
GraphicsLayer* reflectionLayer = m_owningLayer->reflectionLayer()->backing()->graphicsLayer();
@@ -1066,6 +1083,23 @@ bool RenderLayerBacking::updateMaskLayer(bool needsMaskLayer)
return layerChanged;
}
+bool RenderLayerBacking::updateBorderRadiusLayer(bool needsBorderRadiusLayer)
+{
+ bool layerChanged = false;
+ if (needsBorderRadiusLayer) {
+ if (!m_borderRadiusLayer) {
+ m_borderRadiusLayer = createGraphicsLayer("BorderRadiusMask", CompositingReasonLayerForMask);
+ m_borderRadiusLayer->setDrawsContent(true);
+ m_borderRadiusLayer->setPaintingPhase(GraphicsLayerPaintBorderRadiusMask);
+ layerChanged = true;
+ }
+ } else if (m_borderRadiusLayer) {
+ m_borderRadiusLayer = nullptr;
+ layerChanged = true;
+ }
+ return layerChanged;
+}
+
bool RenderLayerBacking::updateScrollingLayers(bool needsScrollingLayers)
{
ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLayer(m_owningLayer);
@@ -1553,6 +1587,9 @@ void RenderLayerBacking::setContentsNeedDisplay()
if (m_maskLayer && m_maskLayer->drawsContent())
m_maskLayer->setNeedsDisplay();
+ if (m_borderRadiusLayer && m_borderRadiusLayer->drawsContent())
+ m_borderRadiusLayer->setNeedsDisplay();
+
if (m_scrollingContentsLayer && m_scrollingContentsLayer->drawsContent())
m_scrollingContentsLayer->setNeedsDisplay();
}
@@ -1587,6 +1624,12 @@ void RenderLayerBacking::setContentsNeedDisplayInRect(const IntRect& r)
m_maskLayer->setNeedsDisplayInRect(layerDirtyRect);
}
+ if (m_borderRadiusLayer && m_borderRadiusLayer->drawsContent()) {
+ IntRect layerDirtyRect = r;
+ layerDirtyRect.move(-m_borderRadiusLayer->offsetFromRenderer());
+ m_borderRadiusLayer->setNeedsDisplayInRect(layerDirtyRect);
+ }
+
if (m_scrollingContentsLayer && m_scrollingContentsLayer->drawsContent()) {
IntRect layerDirtyRect = r;
layerDirtyRect.move(-m_scrollingContentsLayer->offsetFromRenderer());
@@ -1612,6 +1655,8 @@ void RenderLayerBacking::paintIntoLayer(const GraphicsLayer* graphicsLayer, Grap
paintFlags |= RenderLayer::PaintLayerPaintingCompositingForegroundPhase;
if (paintingPhase & GraphicsLayerPaintMask)
paintFlags |= RenderLayer::PaintLayerPaintingCompositingMaskPhase;
+ if (paintingPhase & GraphicsLayerPaintBorderRadiusMask)
+ paintFlags |= RenderLayer::PaintLayerPaintingCompositingBorderRadiusMaskPhase;
if (paintingPhase & GraphicsLayerPaintOverflowContents)
paintFlags |= RenderLayer::PaintLayerPaintingOverflowContents;
if (paintingPhase & GraphicsLayerPaintCompositedScroll)
@@ -1658,6 +1703,7 @@ void RenderLayerBacking::paintContents(const GraphicsLayer* graphicsLayer, Graph
|| graphicsLayer == m_foregroundLayer.get()
|| graphicsLayer == m_backgroundLayer.get()
|| graphicsLayer == m_maskLayer.get()
+ || graphicsLayer == m_borderRadiusLayer.get()
|| graphicsLayer == m_scrollingContentsLayer.get()) {
InspectorInstrumentation::willPaint(renderer());
@@ -1935,6 +1981,8 @@ double RenderLayerBacking::backingStoreMemoryEstimate() const
backingMemory += m_backgroundLayer->backingStoreMemoryEstimate();
if (m_maskLayer)
backingMemory += m_maskLayer->backingStoreMemoryEstimate();
+ if (m_borderRadiusLayer)
+ backingMemory += m_borderRadiusLayer->backingStoreMemoryEstimate();
if (m_scrollingContentsLayer)
backingMemory += m_scrollingContentsLayer->backingStoreMemoryEstimate();
@@ -1962,6 +2010,7 @@ void RenderLayerBacking::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) c
info.addMember(m_backgroundLayer, "backgroundLayer");
info.addMember(m_childContainmentLayer, "childContainmentLayer");
info.addMember(m_maskLayer, "maskLayer");
+ info.addMember(m_borderRadiusLayer, "borderRadiusLayer");
info.addMember(m_layerForHorizontalScrollbar, "layerForHorizontalScrollbar");
info.addMember(m_layerForVerticalScrollbar, "layerForVerticalScrollbar");
info.addMember(m_layerForScrollCorner, "layerForScrollCorner");
« no previous file with comments | « Source/core/rendering/RenderLayerBacking.h ('k') | Source/core/rendering/RenderLayerCompositor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698