Unmatched transparency layer begin/end on a filtered element with an opacity ancestor
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 14 Jan 2012 15:51:35 +0000 (15:51 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 14 Jan 2012 15:51:35 +0000 (15:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=76329

Source/WebCore:

Reviewed by Dan Bernstein.

When doing a paint with painting disabled on the GraphicsContext, as we do
for updating control tints, or computing text rectangles on Find, do not
apply filter effects. This is both a performance gain, and fixes an issue
with mismatched begin/end transparency layers.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintLayerContents):

Reviewed by Dan Bernstein.

Manual test with a filtered element as a descendant of an element with
opacity. Doing a Find is necessary to exercise the test.

* ManualTests/filters/opacity-above-filter.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@105019 268f45cc-cd09-0410-ab3c-d52691b4dbfc

ChangeLog
ManualTests/filters/opacity-above-filter.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderLayer.cpp

index b83264d..3493d39 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2012-01-13  Simon Fraser  <simon.fraser@apple.com>
+
+        Unmatched transparency layer begin/end on a filtered element with an opacity ancestor
+        https://bugs.webkit.org/show_bug.cgi?id=76329
+
+        Reviewed by Dan Bernstein.
+        
+        Manual test with a filtered element as a descendant of an element with
+        opacity. Doing a Find is necessary to exercise the test.
+
+        * ManualTests/filters/opacity-above-filter.html: Added.
+
 2012-01-13  Eli Fidler  <efidler@rim.com>
 
         GCC compiler version is not detected properly for QNX qcc variant
diff --git a/ManualTests/filters/opacity-above-filter.html b/ManualTests/filters/opacity-above-filter.html
new file mode 100644 (file)
index 0000000..ecac0bc
--- /dev/null
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+  <style>
+    
+    .container {
+      opacity: 0.8;
+      margin: 10px;
+    }
+    
+    .filtered {
+      width: 100px;
+      height: 100px;
+      background-color: blue;
+      -webkit-filter: blur(10px);
+    }
+  </style>
+</head>
+<body>
+  <a href="https://bugs.webkit.org/show_bug.cgi?id=76329">https://bugs.webkit.org/show_bug.cgi?id=76329</a>
+  <p>Open this test in Safari, and hit Command-F to Find. A debug build should not assert.</p>
+  <div class="container">
+      <div class="filtered box"></div>
+  </div>
+</body>
+</html>
index 898e10a..7f3b839 100644 (file)
@@ -1,3 +1,21 @@
+2012-01-14  Simon Fraser  <simon.fraser@apple.com>
+
+        Unmatched transparency layer begin/end on a filtered element with an opacity ancestor
+        https://bugs.webkit.org/show_bug.cgi?id=76329
+
+        Reviewed by Dan Bernstein.
+
+        When doing a paint with painting disabled on the GraphicsContext, as we do
+        for updating control tints, or computing text rectangles on Find, do not
+        apply filter effects. This is both a performance gain, and fixes an issue
+        with mismatched begin/end transparency layers.
+        
+        Manual test:
+            ManualTests/filters/opacity-above-filter.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::paintLayerContents):
+
 2012-01-13  Ojan Vafai  <ojan@chromium.org>
 
         Implement flex-align
index 34c7a1c..6c6c78c 100644 (file)
@@ -2863,7 +2863,7 @@ void RenderLayer::paintLayerContents(RenderLayer* rootLayer, GraphicsContext* co
                 beginTransparencyLayers(context, rootLayer, paintBehavior);
         
 #if ENABLE(CSS_FILTERS)
-            if (filterPainter.haveFilterEffect())
+            if (filterPainter.haveFilterEffect() && !context->paintingDisabled())
                 context = filterPainter.beginFilterEffect(this, context, transparencyClipBox(this, rootLayer, paintBehavior));
 #endif
         
@@ -2892,7 +2892,7 @@ void RenderLayer::paintLayerContents(RenderLayer* rootLayer, GraphicsContext* co
 
 #if ENABLE(CSS_FILTERS)
             // If the filter was not started yet, start it now, after the transparency layer was lazily created.
-            if (filterPainter.haveFilterEffect() && !filterPainter.hasStartedFilterEffect())
+            if (filterPainter.haveFilterEffect() && !filterPainter.hasStartedFilterEffect() && !context->paintingDisabled())
                 context = filterPainter.beginFilterEffect(this, context, transparencyClipBox(this, rootLayer, paintBehavior));
 #endif
             // Set up the clip used when painting our children.