[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

simon.fraser at apple.com simon.fraser at apple.com
Wed Dec 22 18:38:01 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 2f5f5c8a99141ddf421c2728d97138c2a0bde2c3
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Dec 15 00:09:58 2010 +0000

    2010-12-14  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Dan Bernstein.
    
            compositing/masks/simple-composited-mask.html failure
            https://bugs.webkit.org/show_bug.cgi?id=49746
    
            Geometry of composited layers with a mask depends on the loading
            of the mask image, since maskClipRect() is used for the layer bounds.
    
            So when RenderBox::imageChanged() is called for an image used by
            a mask on a layer with a composited mask, call the newly-renamed
            layer->contentsChanged() method. This percolates down into RenderLayerBacking,
            ending in a layer geometry update.
    
            Renamed RenderLayer::rendereContentsChanged() to contentsChanged() and added
            an enum to say what changed, for somewhat more efficient updating.
    
            Also, when the mask layer gets resized, make sure we mark it as needing
            display.
    
            Tested by pixel result of compositing/masks/simple-composited-mask.html
    
            * html/canvas/CanvasRenderingContext2D.cpp:
            (WebCore::CanvasRenderingContext2D::didDraw):
            * html/canvas/WebGLRenderingContext.cpp:
            (WebCore::WebGLRenderingContext::markContextChanged):
            (WebCore::WebGLRenderingContext::reshape):
            * rendering/RenderBox.cpp:
            (WebCore::layersUseImage):
            (WebCore::RenderBox::imageChanged):
            * rendering/RenderImage.cpp:
            (WebCore::RenderImage::imageDimensionsChanged):
            (WebCore::RenderImage::notifyFinished):
            * rendering/RenderLayer.cpp:
            (WebCore::RenderLayer::contentChanged):
            * rendering/RenderLayer.h:
            * rendering/RenderLayerBacking.cpp:
            (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
            (WebCore::RenderLayerBacking::contentChanged):
            * rendering/RenderLayerBacking.h:
            * rendering/RenderVideo.cpp:
            (WebCore::RenderVideo::updatePlayer):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74066 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index f3e4f25..df7471d 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,47 @@
+2010-12-14  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        compositing/masks/simple-composited-mask.html failure
+        https://bugs.webkit.org/show_bug.cgi?id=49746
+
+        Geometry of composited layers with a mask depends on the loading
+        of the mask image, since maskClipRect() is used for the layer bounds.
+        
+        So when RenderBox::imageChanged() is called for an image used by
+        a mask on a layer with a composited mask, call the newly-renamed
+        layer->contentsChanged() method. This percolates down into RenderLayerBacking,
+        ending in a layer geometry update.
+        
+        Renamed RenderLayer::rendereContentsChanged() to contentsChanged() and added
+        an enum to say what changed, for somewhat more efficient updating.
+        
+        Also, when the mask layer gets resized, make sure we mark it as needing
+        display.
+        
+        Tested by pixel result of compositing/masks/simple-composited-mask.html
+
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::didDraw):
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore::WebGLRenderingContext::markContextChanged):
+        (WebCore::WebGLRenderingContext::reshape):
+        * rendering/RenderBox.cpp:
+        (WebCore::layersUseImage):
+        (WebCore::RenderBox::imageChanged):
+        * rendering/RenderImage.cpp:
+        (WebCore::RenderImage::imageDimensionsChanged):
+        (WebCore::RenderImage::notifyFinished):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::contentChanged):
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
+        (WebCore::RenderLayerBacking::contentChanged):
+        * rendering/RenderLayerBacking.h:
+        * rendering/RenderVideo.cpp:
+        (WebCore::RenderVideo::updatePlayer):
+
 2010-12-14  Mark Rowe  <mrowe at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/WebCore/html/canvas/CanvasRenderingContext2D.cpp
index 7a9bc4d..03f53b4 100644
--- a/WebCore/html/canvas/CanvasRenderingContext2D.cpp
+++ b/WebCore/html/canvas/CanvasRenderingContext2D.cpp
@@ -1500,10 +1500,10 @@ void CanvasRenderingContext2D::didDraw(const FloatRect& r, unsigned options)
         drawingContext()->markDirtyRect(enclosingIntRect(dirtyRect));
 #endif
 #if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING)
-    // If we are drawing to hardware and we have a composited layer, just call rendererContentChanged().
+    // If we are drawing to hardware and we have a composited layer, just call contentChanged().
     RenderBox* renderBox = canvas()->renderBox();
     if (isAccelerated() && renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing())
-        renderBox->layer()->rendererContentChanged();
+        renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
     else
 #endif
         canvas()->didDraw(dirtyRect);
diff --git a/WebCore/html/canvas/WebGLRenderingContext.cpp b/WebCore/html/canvas/WebGLRenderingContext.cpp
index ec28b14..51894fe 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.cpp
+++ b/WebCore/html/canvas/WebGLRenderingContext.cpp
@@ -209,7 +209,7 @@ void WebGLRenderingContext::markContextChanged()
 #if USE(ACCELERATED_COMPOSITING)
     RenderBox* renderBox = canvas()->renderBox();
     if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing())
-        renderBox->layer()->rendererContentChanged();
+        renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
     else {
 #endif
         if (!m_markedCanvasDirty)
@@ -240,7 +240,7 @@ void WebGLRenderingContext::reshape(int width, int height)
 #if USE(ACCELERATED_COMPOSITING)
         RenderBox* renderBox = canvas()->renderBox();
         if (renderBox && renderBox->hasLayer())
-            renderBox->layer()->rendererContentChanged();
+            renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
 #endif
         m_needsUpdate = false;
     }
diff --git a/WebCore/rendering/RenderBox.cpp b/WebCore/rendering/RenderBox.cpp
index e4417a9..9c86868 100644
--- a/WebCore/rendering/RenderBox.cpp
+++ b/WebCore/rendering/RenderBox.cpp
@@ -937,6 +937,16 @@ void RenderBox::paintFillLayer(const PaintInfo& paintInfo, const Color& c, const
     paintFillLayerExtended(paintInfo, c, fillLayer, tx, ty, width, height, 0, op, backgroundObject);
 }
 
+static bool layersUseImage(WrappedImagePtr image, const FillLayer* layers)
+{
+    for (const FillLayer* curLayer = layers; curLayer; curLayer = curLayer->next()) {
+        if (curLayer->image() && image == curLayer->image()->data())
+            return true;
+    }
+
+    return false;
+}
+
 void RenderBox::imageChanged(WrappedImagePtr image, const IntRect*)
 {
     if (!parent())
@@ -951,6 +961,12 @@ void RenderBox::imageChanged(WrappedImagePtr image, const IntRect*)
     bool didFullRepaint = repaintLayerRectsForImage(image, style()->backgroundLayers(), true);
     if (!didFullRepaint)
         repaintLayerRectsForImage(image, style()->maskLayers(), false);
+
+
+#if USE(ACCELERATED_COMPOSITING)
+    if (hasLayer() && layer()->hasCompositedMask() && layersUseImage(image, style()->maskLayers()))
+        layer()->contentChanged(RenderLayer::MaskImageChanged);
+#endif
 }
 
 bool RenderBox::repaintLayerRectsForImage(WrappedImagePtr image, const FillLayer* layers, bool drawingBackground)
diff --git a/WebCore/rendering/RenderImage.cpp b/WebCore/rendering/RenderImage.cpp
index 34799f4..609d944 100644
--- a/WebCore/rendering/RenderImage.cpp
+++ b/WebCore/rendering/RenderImage.cpp
@@ -211,7 +211,7 @@ void RenderImage::imageDimensionsChanged(bool imageSizeChanged, const IntRect* r
 #if USE(ACCELERATED_COMPOSITING)
         if (hasLayer()) {
             // Tell any potential compositing layers that the image needs updating.
-            layer()->rendererContentChanged();
+            layer()->contentChanged(RenderLayer::ImageChanged);
         }
 #endif
     }
@@ -229,7 +229,7 @@ void RenderImage::notifyFinished(CachedResource* newImage)
     if (newImage == m_imageResource->cachedImage() && hasLayer()) {
         // tell any potential compositing layers
         // that the image is done and they can reference it directly.
-        layer()->rendererContentChanged();
+        layer()->contentChanged(RenderLayer::ImageChanged);
     }
 #else
     UNUSED_PARAM(newImage);
diff --git a/WebCore/rendering/RenderLayer.cpp b/WebCore/rendering/RenderLayer.cpp
index 362981c..92e45bd 100644
--- a/WebCore/rendering/RenderLayer.cpp
+++ b/WebCore/rendering/RenderLayer.cpp
@@ -229,14 +229,14 @@ RenderLayerCompositor* RenderLayer::compositor() const
     return renderer()->view()->compositor();
 }
 
-void RenderLayer::rendererContentChanged()
+void RenderLayer::contentChanged(ContentChangeType changeType)
 {
     // This can get called when video becomes accelerated, so the layers may change.
-    if (compositor()->updateLayerCompositingState(this))
+    if ((changeType == CanvasChanged || changeType == VideoChanged) && compositor()->updateLayerCompositingState(this))
         compositor()->setCompositingLayersNeedRebuild();
 
     if (m_backing)
-        m_backing->rendererContentChanged();
+        m_backing->contentChanged(changeType);
 }
 #endif // USE(ACCELERATED_COMPOSITING)
 
diff --git a/WebCore/rendering/RenderLayer.h b/WebCore/rendering/RenderLayer.h
index 5d941c1..e0c6047 100644
--- a/WebCore/rendering/RenderLayer.h
+++ b/WebCore/rendering/RenderLayer.h
@@ -283,7 +283,8 @@ public:
     
     // Notification from the renderer that its content changed (e.g. current frame of image changed).
     // Allows updates of layer content without repainting.
-    void rendererContentChanged();
+    enum ContentChangeType { ImageChanged, MaskImageChanged, CanvasChanged, VideoChanged };
+    void contentChanged(ContentChangeType);
 #endif
 
     // Returns true if the accelerated compositing is enabled
diff --git a/WebCore/rendering/RenderLayerBacking.cpp b/WebCore/rendering/RenderLayerBacking.cpp
index 093430b..baa68a5 100644
--- a/WebCore/rendering/RenderLayerBacking.cpp
+++ b/WebCore/rendering/RenderLayerBacking.cpp
@@ -374,7 +374,10 @@ void RenderLayerBacking::updateGraphicsLayerGeometry()
     }
     
     if (m_maskLayer) {
-        m_maskLayer->setSize(m_graphicsLayer->size());
+        if (m_maskLayer->size() != m_graphicsLayer->size()) {
+            m_maskLayer->setSize(m_graphicsLayer->size());
+            m_maskLayer->setNeedsDisplay();
+        }
         m_maskLayer->setPosition(FloatPoint());
     }
     
@@ -794,15 +797,22 @@ bool RenderLayerBacking::isDirectlyCompositedImage() const
     return false;
 }
 
-void RenderLayerBacking::rendererContentChanged()
+void RenderLayerBacking::contentChanged(RenderLayer::ContentChangeType changeType)
 {
-    if (isDirectlyCompositedImage()) {
+    if ((changeType == RenderLayer::ImageChanged) && isDirectlyCompositedImage()) {
         updateImageContents();
         return;
     }
+    
+    if ((changeType == RenderLayer::MaskImageChanged) && m_maskLayer) {
+        // The composited layer bounds relies on box->maskClipRect(), which changes
+        // when the mask image becomes available.
+        bool isUpdateRoot = true;
+        updateAfterLayout(CompositingChildren, isUpdateRoot);
+    }
 
 #if ENABLE(3D_CANVAS) || ENABLE(ACCELERATED_2D_CANVAS)
-    if (isAcceleratedCanvas(renderer())) {
+    if ((changeType == RenderLayer::CanvasChanged) && isAcceleratedCanvas(renderer())) {
         m_graphicsLayer->setContentsNeedsDisplay();
         return;
     }
diff --git a/WebCore/rendering/RenderLayerBacking.h b/WebCore/rendering/RenderLayerBacking.h
index fb3ab67..c5489f3 100644
--- a/WebCore/rendering/RenderLayerBacking.h
+++ b/WebCore/rendering/RenderLayerBacking.h
@@ -101,8 +101,8 @@ public:
     // r is in the coordinate space of the layer's render object
     void setContentsNeedDisplayInRect(const IntRect& r);
 
-    // Notification from the renderer that its content changed; used by RenderImage.
-    void rendererContentChanged();
+    // Notification from the renderer that its content changed.
+    void contentChanged(RenderLayer::ContentChangeType);
 
     // Interface to start, finish, suspend and resume animations and transitions
     bool startTransition(double timeOffset, int property, const RenderStyle* fromStyle, const RenderStyle* toStyle);
diff --git a/WebCore/rendering/RenderVideo.cpp b/WebCore/rendering/RenderVideo.cpp
index 32ba91b..5b82deb 100644
--- a/WebCore/rendering/RenderVideo.cpp
+++ b/WebCore/rendering/RenderVideo.cpp
@@ -237,7 +237,7 @@ void RenderVideo::updatePlayer()
     }
 
 #if USE(ACCELERATED_COMPOSITING)
-    layer()->rendererContentChanged();
+    layer()->contentChanged(RenderLayer::VideoChanged);
 #endif
     
     IntRect videoBounds = videoBox(); 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list