- Revision
- 136433
- Author
- [email protected]
- Date
- 2012-12-03 13:19:30 -0800 (Mon, 03 Dec 2012)
Log Message
When animating mask-postion on a composited layer, element renders incorrectly
https://bugs.webkit.org/show_bug.cgi?id=103700
Reviewed by Tim Horton.
Source/WebCore:
When a composited layer has a mask, we clipped the layer bounds to the
size of the mask. This caused problems when animating the mask origin,
which is considered a 'repaint' style change and so should not require
layout or compositing geometry changes.
Fix by ignoring the mask when computing the bounds of the compositing
layer.
Test: compositing/masks/mask-layer-size.html
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::localBoundingBox):
(WebCore::RenderLayer::calculateLayerBounds):
* rendering/RenderLayer.h:
(RenderLayer):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::calculateCompositedBounds):
LayoutTests:
Test that dumps the layer tree for a composited layer with a mask.
* compositing/masks/mask-layer-size-expected.txt: Added.
* compositing/masks/mask-layer-size.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (136432 => 136433)
--- trunk/LayoutTests/ChangeLog 2012-12-03 21:07:53 UTC (rev 136432)
+++ trunk/LayoutTests/ChangeLog 2012-12-03 21:19:30 UTC (rev 136433)
@@ -1,3 +1,15 @@
+2012-12-03 Simon Fraser <[email protected]>
+
+ When animating mask-postion on a composited layer, element renders incorrectly
+ https://bugs.webkit.org/show_bug.cgi?id=103700
+
+ Reviewed by Tim Horton.
+
+ Test that dumps the layer tree for a composited layer with a mask.
+
+ * compositing/masks/mask-layer-size-expected.txt: Added.
+ * compositing/masks/mask-layer-size.html: Added.
+
2012-12-03 Xan Lopez <[email protected]>
[CSS Grid Layout] Support <percentage> and viewport-relative breadth sizes
Added: trunk/LayoutTests/compositing/masks/mask-layer-size-expected.txt (0 => 136433)
--- trunk/LayoutTests/compositing/masks/mask-layer-size-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/masks/mask-layer-size-expected.txt 2012-12-03 21:19:30 UTC (rev 136433)
@@ -0,0 +1,16 @@
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (position 10.00 10.00)
+ (bounds 400.00 200.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+)
+
Property changes on: trunk/LayoutTests/compositing/masks/mask-layer-size-expected.txt
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/masks/mask-layer-size.html (0 => 136433)
--- trunk/LayoutTests/compositing/masks/mask-layer-size.html (rev 0)
+++ trunk/LayoutTests/compositing/masks/mask-layer-size.html 2012-12-03 21:19:30 UTC (rev 136433)
@@ -0,0 +1,47 @@
+<html>
+<head>
+<style type="text/css">
+ body {
+ overflow: hidden; /* hide scrollbars */
+ }
+
+ .container {
+ border: 2px solid blue;
+ width: 400px;
+ }
+ #masked {
+ width: 400px;
+ height: 200px;
+ background-color: black;
+ -webkit-mask-image: url(../resources/alpha-blocks.png);
+ -webkit-mask-position: 0px 0px;
+ -webkit-mask-size: 200px 200px;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-transform: translateZ(0);
+ }
+
+ #layers {
+ opacity: 0; /* hide in pixel test */
+ }
+</style>
+<script type="text/_javascript_" charset="utf-8">
+ if (window.testRunner)
+ testRunner.dumpAsText();
+
+ function dumpLayers()
+ {
+ if (window.testRunner)
+ document.getElementById('layers').textContent = window.internals.layerTreeAsText(document);
+ }
+ window.addEventListener('load', dumpLayers, false);
+</script>
+</head>
+<body>
+ <div class="container">
+ <div id="masked" _onwebkitanimationstart_="pauseAnimation()"></div>
+ </div>
+
+<pre id="layers">Layer tree goes here when testing</pre>
+
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/masks/mask-layer-size.html
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Modified: trunk/LayoutTests/platform/chromium/TestExpectations (136432 => 136433)
--- trunk/LayoutTests/platform/chromium/TestExpectations 2012-12-03 21:07:53 UTC (rev 136432)
+++ trunk/LayoutTests/platform/chromium/TestExpectations 2012-12-03 21:19:30 UTC (rev 136433)
@@ -4276,6 +4276,10 @@
webkit.org/b/102624 [ Linux Win ] fast/events/stopPropagation-submit.html [ Text ]
webkit.org/b/103149 [ Mac ] fast/events/stopPropagation-submit.html [ Pass Failure ]
+# Needs rebaseline after https://bugs.webkit.org/show_bug.cgi?id=103700
+webkit.org/b/103700 compositing/masks/simple-composited-mask.html [ ImageOnlyFailure ]
+webkit.org/b/103700 compositing/masks/masked-ancestor.html [ ImageOnlyFailure ]
+
# Some compositing tests doesn't work on multiple platforms.
webkit.org/b/103721 [ Mac Win Linux ] compositing/geometry/vertical-scroll-composited.html [ ImageOnlyFailure ]
webkit.org/b/103721 [ Mac Win Linux ] compositing/reflections/load-video-in-reflection.html [ ImageOnlyFailure ]
Modified: trunk/Source/WebCore/ChangeLog (136432 => 136433)
--- trunk/Source/WebCore/ChangeLog 2012-12-03 21:07:53 UTC (rev 136432)
+++ trunk/Source/WebCore/ChangeLog 2012-12-03 21:19:30 UTC (rev 136433)
@@ -1,3 +1,28 @@
+2012-12-03 Simon Fraser <[email protected]>
+
+ When animating mask-postion on a composited layer, element renders incorrectly
+ https://bugs.webkit.org/show_bug.cgi?id=103700
+
+ Reviewed by Tim Horton.
+
+ When a composited layer has a mask, we clipped the layer bounds to the
+ size of the mask. This caused problems when animating the mask origin,
+ which is considered a 'repaint' style change and so should not require
+ layout or compositing geometry changes.
+
+ Fix by ignoring the mask when computing the bounds of the compositing
+ layer.
+
+ Test: compositing/masks/mask-layer-size.html
+
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::localBoundingBox):
+ (WebCore::RenderLayer::calculateLayerBounds):
+ * rendering/RenderLayer.h:
+ (RenderLayer):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::calculateCompositedBounds):
+
2012-12-03 Xan Lopez <[email protected]>
[CSS Grid Layout] Support <percentage> and viewport-relative breadth sizes
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (136432 => 136433)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2012-12-03 21:07:53 UTC (rev 136432)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2012-12-03 21:19:30 UTC (rev 136433)
@@ -4456,7 +4456,7 @@
return boundingBox(rootLayer, offsetFromRoot).intersects(damageRect);
}
-LayoutRect RenderLayer::localBoundingBox() const
+LayoutRect RenderLayer::localBoundingBox(CalculateLayerBoundsFlags flags) const
{
// There are three special cases we need to consider.
// (1) Inline Flows. For inline flows we will create a bounding box that fully encompasses all of the lines occupied by the
@@ -4484,7 +4484,7 @@
} else {
RenderBox* box = renderBox();
ASSERT(box);
- if (box->hasMask()) {
+ if (!(flags & DontConstrainForMask) && box->hasMask()) {
result = box->maskClipRect();
box->flipForWritingMode(result); // The mask clip rect is in physical coordinates, so we have to flip, since localBoundingBox is not.
} else {
@@ -4543,7 +4543,7 @@
return renderer->view()->unscaledDocumentRect();
}
- LayoutRect boundingBoxRect = localBoundingBox();
+ LayoutRect boundingBoxRect = localBoundingBox(flags);
if (renderer->isBox())
toRenderBox(renderer)->flipForWritingMode(boundingBoxRect);
Modified: trunk/Source/WebCore/rendering/RenderLayer.h (136432 => 136433)
--- trunk/Source/WebCore/rendering/RenderLayer.h 2012-12-03 21:07:53 UTC (rev 136432)
+++ trunk/Source/WebCore/rendering/RenderLayer.h 2012-12-03 21:19:30 UTC (rev 136433)
@@ -573,21 +573,23 @@
// Pass offsetFromRoot if known.
bool intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot = 0) const;
- // Bounding box relative to some ancestor layer. Pass offsetFromRoot if known.
- LayoutRect boundingBox(const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot = 0) const;
- // Bounding box in the coordinates of this layer.
- LayoutRect localBoundingBox() const;
- // Pixel snapped bounding box relative to the root.
- IntRect absoluteBoundingBox() const;
-
enum CalculateLayerBoundsFlag {
IncludeSelfTransform = 1 << 0,
UseLocalClipRectIfPossible = 1 << 1,
IncludeLayerFilterOutsets = 1 << 2,
ExcludeHiddenDescendants = 1 << 3,
+ DontConstrainForMask = 1 << 4,
DefaultCalculateLayerBoundsFlags = IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets
};
typedef unsigned CalculateLayerBoundsFlags;
+
+ // Bounding box relative to some ancestor layer. Pass offsetFromRoot if known.
+ LayoutRect boundingBox(const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot = 0) const;
+ // Bounding box in the coordinates of this layer.
+ LayoutRect localBoundingBox(CalculateLayerBoundsFlags = 0) const;
+ // Pixel snapped bounding box relative to the root.
+ IntRect absoluteBoundingBox() const;
+
// Can pass offsetFromRoot if known.
IntRect calculateLayerBounds(const RenderLayer* ancestorLayer, const LayoutPoint* offsetFromRoot = 0, CalculateLayerBoundsFlags = DefaultCalculateLayerBoundsFlags) const;
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (136432 => 136433)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-12-03 21:07:53 UTC (rev 136432)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-12-03 21:19:30 UTC (rev 136433)
@@ -678,7 +678,7 @@
{
if (!canBeComposited(layer))
return IntRect();
- return layer->calculateLayerBounds(ancestorLayer, 0, RenderLayer::DefaultCalculateLayerBoundsFlags | RenderLayer::ExcludeHiddenDescendants);
+ return layer->calculateLayerBounds(ancestorLayer, 0, RenderLayer::DefaultCalculateLayerBoundsFlags | RenderLayer::ExcludeHiddenDescendants | RenderLayer::DontConstrainForMask);
}
void RenderLayerCompositor::layerWasAdded(RenderLayer* /*parent*/, RenderLayer* /*child*/)