Title: [136433] trunk
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*/)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to