[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.18-1-697-g2f78b87

oliver at apple.com oliver at apple.com
Wed Jan 20 22:26:05 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit d6ed5876f90b6e3166f0049c1be2ad2d3c56156a
Author: oliver at apple.com <oliver at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Jan 15 20:54:37 2010 +0000

    2010-01-15  Oliver Hunt  <oliver at apple.com>
    
            Reviewed by Dirk Schulze.
    
            Bad DOM performance in large SVG files
            https://bugs.webkit.org/show_bug.cgi?id=30055
    
            Add an early return when we go to paint a RenderPath that
            isn't in the current clip.
    
            * rendering/RenderPath.cpp:
            (WebCore::RenderPath::paint):
            * svg/graphics/SVGImage.cpp:
            (WebCore::SVGImage::draw):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53343 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 69fc8d4..eff6f0e 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,18 @@
+2010-01-15  Oliver Hunt  <oliver at apple.com>
+
+        Reviewed by Dirk Schulze.
+
+        Bad DOM performance in large SVG files
+        https://bugs.webkit.org/show_bug.cgi?id=30055
+
+        Add an early return when we go to paint a RenderPath that
+        isn't in the current clip.
+
+        * rendering/RenderPath.cpp:
+        (WebCore::RenderPath::paint):
+        * svg/graphics/SVGImage.cpp:
+        (WebCore::SVGImage::draw):
+
 2010-01-15  Steve Block  <steveblock at google.com>
 
         Reviewed by Eric Seidel.
diff --git a/WebCore/rendering/RenderPath.cpp b/WebCore/rendering/RenderPath.cpp
index 86d280b..81cddfa 100644
--- a/WebCore/rendering/RenderPath.cpp
+++ b/WebCore/rendering/RenderPath.cpp
@@ -215,32 +215,40 @@ void RenderPath::paint(PaintInfo& paintInfo, int, int)
 {
     if (paintInfo.context->paintingDisabled() || style()->visibility() == HIDDEN || m_path.isEmpty())
         return;
-            
-    paintInfo.context->save();
-    paintInfo.context->concatCTM(localToParentTransform());
+
+    PaintInfo childPaintInfo(paintInfo);
+    childPaintInfo.context->save();
+    applyTransformToPaintInfo(childPaintInfo, m_localTransform);
+    FloatRect boundingBox = repaintRectInLocalCoordinates();
+    // FIXME: The empty rect check is to deal with incorrect initial clip in renderSubtreeToImage
+    // unfortunately fixing that problem is fairly complex unless we were willing to just futz the
+    // rect to something "close enough"
+    if (!boundingBox.intersects(childPaintInfo.rect) && !childPaintInfo.rect.isEmpty()) {
+        childPaintInfo.context->restore();
+        return;
+    }
 
     SVGResourceFilter* filter = 0;
 
-    FloatRect boundingBox = repaintRectInLocalCoordinates();
-    if (paintInfo.phase == PaintPhaseForeground) {
-        PaintInfo savedInfo(paintInfo);
+    if (childPaintInfo.phase == PaintPhaseForeground) {
+        PaintInfo savedInfo(childPaintInfo);
 
-        if (prepareToRenderSVGContent(this, paintInfo, boundingBox, filter)) {
+        if (prepareToRenderSVGContent(this, childPaintInfo, boundingBox, filter)) {
             if (style()->svgStyle()->shapeRendering() == SR_CRISPEDGES)
-                paintInfo.context->setShouldAntialias(false);
-            fillAndStrokePath(m_path, paintInfo.context, style(), this);
+                childPaintInfo.context->setShouldAntialias(false);
+            fillAndStrokePath(m_path, childPaintInfo.context, style(), this);
 
             if (static_cast<SVGStyledElement*>(node())->supportsMarkers())
-                m_markerLayoutInfo.drawMarkers(paintInfo);
+                m_markerLayoutInfo.drawMarkers(childPaintInfo);
         }
-        finishRenderSVGContent(this, paintInfo, filter, savedInfo.context);
+        finishRenderSVGContent(this, childPaintInfo, filter, savedInfo.context);
     }
 
-    if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth())
-        paintOutline(paintInfo.context, static_cast<int>(boundingBox.x()), static_cast<int>(boundingBox.y()),
+    if ((childPaintInfo.phase == PaintPhaseOutline || childPaintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth())
+        paintOutline(childPaintInfo.context, static_cast<int>(boundingBox.x()), static_cast<int>(boundingBox.y()),
             static_cast<int>(boundingBox.width()), static_cast<int>(boundingBox.height()), style());
     
-    paintInfo.context->restore();
+    childPaintInfo.context->restore();
 }
 
 // This method is called from inside paintOutline() since we call paintOutline()
diff --git a/WebCore/svg/graphics/SVGImage.cpp b/WebCore/svg/graphics/SVGImage.cpp
index 050dcca..348df4f 100644
--- a/WebCore/svg/graphics/SVGImage.cpp
+++ b/WebCore/svg/graphics/SVGImage.cpp
@@ -193,7 +193,7 @@ void SVGImage::draw(GraphicsContext* context, const FloatRect& dstRect, const Fl
 
     if (view->needsLayout())
         view->layout();
-    view->paint(context, enclosingIntRect(srcRect));
+    view->paint(context, IntRect(0, 0, view->width(), view->height()));
 
     if (compositeOp != CompositeSourceOver)
         context->endTransparencyLayer();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list