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

zherczeg at webkit.org zherczeg at webkit.org
Wed Dec 22 14:51:22 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit f13891688ec0b7c08c4ff139d59cdf1e0da44dec
Author: zherczeg at webkit.org <zherczeg at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Oct 22 08:37:33 2010 +0000

    Moving all bounding box related calculation to RenderSVGResourceFilterPrimitive
    https://bugs.webkit.org/show_bug.cgi?id=47174
    
    Reviewed by Dirk Schulze.
    
    The primitive sub-region calculation was spread in many
    files across in WebKit source code, and all of them are moved
    to RenderSVGResourceFilterPrimitive, where they should be.
    In this patch the calculation is a static method which will
    be turned to a real member function in the near future.
    
    * platform/graphics/filters/FETile.cpp:
    * platform/graphics/filters/FETile.h:
    (WebCore::FETile::filterEffectType):
    * platform/graphics/filters/Filter.h:
    * platform/graphics/filters/FilterEffect.cpp:
    * platform/graphics/filters/FilterEffect.h:
    * rendering/RenderSVGResourceFilter.cpp:
    (WebCore::RenderSVGResourceFilter::applyResource):
    * rendering/RenderSVGResourceFilterPrimitive.cpp:
    (WebCore::RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion):
    * rendering/RenderSVGResourceFilterPrimitive.h:
    (WebCore::RenderSVGResourceFilterPrimitive::RenderSVGResourceFilterPrimitive):
    * svg/graphics/filters/SVGFilter.cpp:
    * svg/graphics/filters/SVGFilter.h:
    (WebCore::SVGFilter::mapLocalRectToAbsoluteRect):
    (WebCore::SVGFilter::targetBoundingBox):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@70296 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 155977c..529c77b 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,33 @@
+2010-10-22  Zoltan Herczeg  <zherczeg at webkit.org>
+
+        Reviewed by Dirk Schulze.
+
+        Moving all bounding box related calculation to RenderSVGResourceFilterPrimitive
+        https://bugs.webkit.org/show_bug.cgi?id=47174
+
+        The primitive sub-region calculation was spread in many
+        files across in WebKit source code, and all of them are moved
+        to RenderSVGResourceFilterPrimitive, where they should be.
+        In this patch the calculation is a static method which will
+        be turned to a real member function in the near future.
+
+        * platform/graphics/filters/FETile.cpp:
+        * platform/graphics/filters/FETile.h:
+        (WebCore::FETile::filterEffectType):
+        * platform/graphics/filters/Filter.h:
+        * platform/graphics/filters/FilterEffect.cpp:
+        * platform/graphics/filters/FilterEffect.h:
+        * rendering/RenderSVGResourceFilter.cpp:
+        (WebCore::RenderSVGResourceFilter::applyResource):
+        * rendering/RenderSVGResourceFilterPrimitive.cpp:
+        (WebCore::RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion):
+        * rendering/RenderSVGResourceFilterPrimitive.h:
+        (WebCore::RenderSVGResourceFilterPrimitive::RenderSVGResourceFilterPrimitive):
+        * svg/graphics/filters/SVGFilter.cpp:
+        * svg/graphics/filters/SVGFilter.h:
+        (WebCore::SVGFilter::mapLocalRectToAbsoluteRect):
+        (WebCore::SVGFilter::targetBoundingBox):
+
 2010-10-21  Kwang Yul Seo  <skyul at company100.net>
 
         Reviewed by Kent Tamura.
diff --git a/WebCore/platform/graphics/filters/FETile.cpp b/WebCore/platform/graphics/filters/FETile.cpp
index a695d3b..57160ed 100644
--- a/WebCore/platform/graphics/filters/FETile.cpp
+++ b/WebCore/platform/graphics/filters/FETile.cpp
@@ -41,14 +41,6 @@ PassRefPtr<FETile> FETile::create()
     return adoptRef(new FETile);
 }
 
-FloatRect FETile::determineFilterPrimitiveSubregion(Filter* filter)
-{
-    inputEffect(0)->determineFilterPrimitiveSubregion(filter);
-
-    filter->determineFilterPrimitiveSubregion(this, filter->filterRegionInUserSpace());
-    return filterPrimitiveSubregion();
-}
-
 void FETile::apply(Filter* filter)
 {
 // FIXME: See bug 47315. This is a hack to work around a compile failure, but is incorrect behavior otherwise.
diff --git a/WebCore/platform/graphics/filters/FETile.h b/WebCore/platform/graphics/filters/FETile.h
index 8562c90..5f21433 100644
--- a/WebCore/platform/graphics/filters/FETile.h
+++ b/WebCore/platform/graphics/filters/FETile.h
@@ -37,10 +37,10 @@ public:
 
     virtual void determineAbsolutePaintRect(Filter*) { setAbsolutePaintRect(maxEffectRect()); }
 
+    virtual FilterEffectType filterEffectType() const { return FilterEffectTypeTile; }
+
     virtual TextStream& externalRepresentation(TextStream&, int indention) const;
 
-    virtual FloatRect determineFilterPrimitiveSubregion(Filter*);
-    
 private:
     FETile();
 };
diff --git a/WebCore/platform/graphics/filters/Filter.h b/WebCore/platform/graphics/filters/Filter.h
index 121e389..33cf724 100644
--- a/WebCore/platform/graphics/filters/Filter.h
+++ b/WebCore/platform/graphics/filters/Filter.h
@@ -52,12 +52,8 @@ namespace WebCore {
         
         virtual FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint&) const { return FloatPoint(); }
 
-        // SVG specific
-        virtual void determineFilterPrimitiveSubregion(FilterEffect*, const FloatRect&) { }
-        
         virtual FloatRect filterRegionInUserSpace() const { return FloatRect(); }
 
-        virtual FloatSize maxImageSize() const = 0;
         virtual bool effectBoundingBoxMode() const = 0;
 
     private:
diff --git a/WebCore/platform/graphics/filters/FilterEffect.cpp b/WebCore/platform/graphics/filters/FilterEffect.cpp
index 121b921..ad351a5 100644
--- a/WebCore/platform/graphics/filters/FilterEffect.cpp
+++ b/WebCore/platform/graphics/filters/FilterEffect.cpp
@@ -39,23 +39,6 @@ FilterEffect::~FilterEffect()
 {
 }
 
-FloatRect FilterEffect::determineFilterPrimitiveSubregion(Filter* filter)
-{
-    FloatRect uniteRect;
-    unsigned size = m_inputEffects.size();
-
-    // FETurbulence, FEImage and FEFlood don't have input effects, take the filter region as unite rect.
-    if (!size)
-        uniteRect = filter->filterRegionInUserSpace();
-    else {
-        for (unsigned i = 0; i < size; ++i)
-            uniteRect.unite(m_inputEffects.at(i)->determineFilterPrimitiveSubregion(filter));
-    }
-
-    filter->determineFilterPrimitiveSubregion(this, uniteRect);
-    return m_filterPrimitiveSubregion;
-}
-
 void FilterEffect::determineAbsolutePaintRect(Filter*)
 {
     m_absolutePaintRect = IntRect();
diff --git a/WebCore/platform/graphics/filters/FilterEffect.h b/WebCore/platform/graphics/filters/FilterEffect.h
index a614b59..25db57b 100644
--- a/WebCore/platform/graphics/filters/FilterEffect.h
+++ b/WebCore/platform/graphics/filters/FilterEffect.h
@@ -99,9 +99,6 @@ public:
     bool hasHeight() const { return m_hasHeight; }
     void setHasHeight(bool value) { m_hasHeight = value; }
 
-    // FIXME: FETile still needs special handling.
-    virtual FloatRect determineFilterPrimitiveSubregion(Filter*);
-
     FloatRect filterPrimitiveSubregion() const { return m_filterPrimitiveSubregion; }
     void setFilterPrimitiveSubregion(const FloatRect& filterPrimitiveSubregion) { m_filterPrimitiveSubregion = filterPrimitiveSubregion; }
 
diff --git a/WebCore/rendering/RenderSVGResourceFilter.cpp b/WebCore/rendering/RenderSVGResourceFilter.cpp
index 3203ddf..50cf68e 100644
--- a/WebCore/rendering/RenderSVGResourceFilter.cpp
+++ b/WebCore/rendering/RenderSVGResourceFilter.cpp
@@ -35,6 +35,7 @@
 #include "ImageData.h"
 #include "IntRect.h"
 #include "RenderSVGResource.h"
+#include "RenderSVGResourceFilterPrimitive.h"
 #include "SVGElement.h"
 #include "SVGFilter.h"
 #include "SVGFilterElement.h"
@@ -205,13 +206,13 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*,
     if (!lastEffect)
         return false;
 
-    // Determine the filter primitive subregions of every effect.
-    lastEffect->determineFilterPrimitiveSubregion(filterData->filter.get());
-    if (!fitsInMaximumImageSize(filterData->filter->maxImageSize(), scale)) {
-        // At least one FilterEffect has a too big image size,
-        // recalculate the effect sizes with new scale factor.
+    RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(lastEffect, filterData->filter.get());
+    FloatRect subRegion = lastEffect->maxEffectRect();
+    // At least one FilterEffect has a too big image size,
+    // recalculate the effect sizes with new scale factors.
+    if (!fitsInMaximumImageSize(subRegion.size(), scale)) {
         filterData->filter->setFilterResolution(scale);
-        lastEffect->determineFilterPrimitiveSubregion(filterData->filter.get());
+        RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(lastEffect, filterData->filter.get());
     }
 
     // If the drawingRegion is empty, we have something like <g filter=".."/>.
diff --git a/WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp b/WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp
index f7381fa..bf2ef6e 100644
--- a/WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp
+++ b/WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp
@@ -28,12 +28,76 @@
 
 #if ENABLE(SVG) && ENABLE(FILTERS)
 #include "RenderSVGResourceFilterPrimitive.h"
+#include "SVGFEImage.h"
 
 namespace WebCore {
 
-RenderSVGResourceFilterPrimitive::RenderSVGResourceFilterPrimitive(SVGFilterPrimitiveStandardAttributes* filterPrimitiveElement)
-    : RenderSVGHiddenContainer(filterPrimitiveElement)
+FloatRect RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(FilterEffect* effect, SVGFilter* filter)
 {
+    FloatRect uniteRect;
+    FloatRect subregionBoundingBox = effect->effectBoundaries();
+    FloatRect subregion = subregionBoundingBox;
+
+    if (effect->filterEffectType() != FilterEffectTypeTile) {
+        // FETurbulence, FEImage and FEFlood don't have input effects, take the filter region as unite rect.
+        if (unsigned numberOfInputEffects = effect->inputEffects().size()) {
+            for (unsigned i = 0; i < numberOfInputEffects; ++i)
+                uniteRect.unite(determineFilterPrimitiveSubregion(effect->inputEffect(i), filter));
+        } else
+            uniteRect = filter->filterRegionInUserSpace();
+    } else {
+        determineFilterPrimitiveSubregion(effect->inputEffect(0), filter);
+        uniteRect = filter->filterRegionInUserSpace();
+    }
+
+    if (filter->effectBoundingBoxMode()) {
+        subregion = uniteRect;
+        // Avoid the calling of a virtual method several times.
+        FloatRect targetBoundingBox = filter->targetBoundingBox();
+
+        if (effect->hasX())
+            subregion.setX(targetBoundingBox.x() + subregionBoundingBox.x() * targetBoundingBox.width());
+
+        if (effect->hasY())
+            subregion.setY(targetBoundingBox.y() + subregionBoundingBox.y() * targetBoundingBox.height());
+
+        if (effect->hasWidth())
+            subregion.setWidth(subregionBoundingBox.width() * targetBoundingBox.width());
+
+        if (effect->hasHeight())
+            subregion.setHeight(subregionBoundingBox.height() * targetBoundingBox.height());
+    } else {
+        if (!effect->hasX())
+            subregion.setX(uniteRect.x());
+
+        if (!effect->hasY())
+            subregion.setY(uniteRect.y());
+
+        if (!effect->hasWidth())
+            subregion.setWidth(uniteRect.width());
+
+        if (!effect->hasHeight())
+            subregion.setHeight(uniteRect.height());
+    }
+
+    effect->setFilterPrimitiveSubregion(subregion);
+
+    FloatRect absoluteSubregion = filter->mapLocalRectToAbsoluteRect(subregion);
+    FloatSize filterResolution = filter->filterResolution();
+    absoluteSubregion.scale(filterResolution.width(), filterResolution.height());
+
+    // FEImage needs the unclipped subregion in absolute coordinates to determine the correct
+    // destination rect in combination with preserveAspectRatio.
+    if (effect->filterEffectType() == FilterEffectTypeImage)
+        reinterpret_cast<FEImage*>(effect)->setAbsoluteSubregion(absoluteSubregion);
+
+    // Clip every filter effect to the filter region.
+    FloatRect absoluteScaledFilterRegion = filter->filterRegion();
+    absoluteScaledFilterRegion.scale(filterResolution.width(), filterResolution.height());
+    absoluteSubregion.intersect(absoluteScaledFilterRegion);
+
+    effect->setMaxEffectRect(enclosingIntRect(absoluteSubregion));
+    return subregion;
 }
 
 } // namespace WebCore
diff --git a/WebCore/rendering/RenderSVGResourceFilterPrimitive.h b/WebCore/rendering/RenderSVGResourceFilterPrimitive.h
index b054203..c890ffe 100644
--- a/WebCore/rendering/RenderSVGResourceFilterPrimitive.h
+++ b/WebCore/rendering/RenderSVGResourceFilterPrimitive.h
@@ -31,12 +31,20 @@
 
 #include "RenderSVGHiddenContainer.h"
 #include "SVGFilterPrimitiveStandardAttributes.h"
+#include "SVGFilter.h"
 
 namespace WebCore {
 
 class RenderSVGResourceFilterPrimitive : public RenderSVGHiddenContainer {
 public:
-    explicit RenderSVGResourceFilterPrimitive(SVGFilterPrimitiveStandardAttributes* filterPrimitiveElement);
+
+    explicit RenderSVGResourceFilterPrimitive(SVGFilterPrimitiveStandardAttributes* filterPrimitiveElement)
+        : RenderSVGHiddenContainer(filterPrimitiveElement)
+    {
+    }
+
+    // They depend on the RenderObject argument of RenderSVGResourceFilter::applyResource.
+    static FloatRect determineFilterPrimitiveSubregion(FilterEffect* effect, SVGFilter* filter);
 
 private:
     virtual const char* renderName() const { return "RenderSVGResourceFilterPrimitive"; }
diff --git a/WebCore/svg/graphics/filters/SVGFilter.cpp b/WebCore/svg/graphics/filters/SVGFilter.cpp
index dfdccd7..e7b61db 100644
--- a/WebCore/svg/graphics/filters/SVGFilter.cpp
+++ b/WebCore/svg/graphics/filters/SVGFilter.cpp
@@ -23,8 +23,6 @@
 #if ENABLE(SVG) && ENABLE(FILTERS)
 #include "SVGFilter.h"
 
-#include "SVGFEImage.h"
-
 namespace WebCore {
 
 SVGFilter::SVGFilter(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode)
@@ -38,64 +36,6 @@ SVGFilter::SVGFilter(const AffineTransform& absoluteTransform, const FloatRect&
     m_absoluteFilterRegion = absoluteTransform.mapRect(filterRegion);
 }
 
-void SVGFilter::determineFilterPrimitiveSubregion(FilterEffect* effect, const FloatRect& unionOfPreviousPrimitiveSubregions)
-{
-    FloatRect subRegionBBox = effect->effectBoundaries();
-    FloatRect newSubRegion = subRegionBBox;
-
-    if (m_effectBBoxMode) {
-        newSubRegion = unionOfPreviousPrimitiveSubregions;
-
-        if (effect->hasX())
-            newSubRegion.setX(m_targetBoundingBox.x() + subRegionBBox.x() * m_targetBoundingBox.width());
-
-       if (effect->hasY())
-            newSubRegion.setY(m_targetBoundingBox.y() + subRegionBBox.y() * m_targetBoundingBox.height());
-
-        if (effect->hasWidth())
-            newSubRegion.setWidth(subRegionBBox.width() * m_targetBoundingBox.width());
-
-        if (effect->hasHeight())
-            newSubRegion.setHeight(subRegionBBox.height() * m_targetBoundingBox.height());
-    } else {
-        if (!effect->hasX())
-            newSubRegion.setX(unionOfPreviousPrimitiveSubregions.x());
-
-        if (!effect->hasY())
-            newSubRegion.setY(unionOfPreviousPrimitiveSubregions.y());
-
-        if (!effect->hasWidth())
-            newSubRegion.setWidth(unionOfPreviousPrimitiveSubregions.width());
-
-        if (!effect->hasHeight())
-            newSubRegion.setHeight(unionOfPreviousPrimitiveSubregions.height());
-    }
-
-    effect->setFilterPrimitiveSubregion(newSubRegion);
-    // TODO: Everything above should be moved to a first phase of layout in RenderSVGResourceFilterPrimitive.
-    // The scaling of the subregion to the repaint rect should be merged with a more intelligent repaint logic
-    // and moved to the second phase of layout in RenderSVGResourceFilterPrimitive.
-    // See bug https://bugs.webkit.org/show_bug.cgi?id=45614.
-    newSubRegion = m_absoluteTransform.mapRect(newSubRegion);
-    newSubRegion.scale(filterResolution().width(), filterResolution().height());
-
-    // FEImage needs the unclipped subregion in absolute coordinates to determine the correct
-    // destination rect in combination with preserveAspectRatio.
-    if (effect->filterEffectType() == FilterEffectTypeImage) {
-        FEImage* imageEffect = static_cast<FEImage*>(effect);
-        imageEffect->setAbsoluteSubregion(newSubRegion);
-    }
-
-    // Clip every filter effect to the filter region.
-    FloatRect absoluteScaledFilterRegion = m_absoluteFilterRegion;
-    absoluteScaledFilterRegion.scale(filterResolution().width(), filterResolution().height());
-    newSubRegion.intersect(absoluteScaledFilterRegion);
-
-    effect->setMaxEffectRect(enclosingIntRect(newSubRegion));
-    if (effect->filterEffectType() != FilterEffectTypeSourceInput)
-        m_maxImageSize = m_maxImageSize.expandedTo(newSubRegion.size()); 
-}
-
 float SVGFilter::applyHorizontalScale(float value) const
 {
     if (m_effectBBoxMode)
diff --git a/WebCore/svg/graphics/filters/SVGFilter.h b/WebCore/svg/graphics/filters/SVGFilter.h
index 1b19e9f..6465f9f 100644
--- a/WebCore/svg/graphics/filters/SVGFilter.h
+++ b/WebCore/svg/graphics/filters/SVGFilter.h
@@ -43,14 +43,13 @@ public:
     virtual FloatRect filterRegion() const { return m_absoluteFilterRegion; }
 
     virtual FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_absoluteTransform.inverse().mapPoint(point); }
+    FloatRect mapLocalRectToAbsoluteRect(const FloatRect& rect) const { return m_absoluteTransform.mapRect(rect); }
 
     virtual float applyHorizontalScale(float value) const;
     virtual float applyVerticalScale(float value) const;
 
     virtual FloatRect sourceImageRect() const { return m_absoluteSourceDrawingRegion; }
-    
-    virtual FloatSize maxImageSize() const { return m_maxImageSize; }
-    virtual void determineFilterPrimitiveSubregion(FilterEffect*, const FloatRect&);
+    FloatRect targetBoundingBox() const { return m_targetBoundingBox; }
 
 private:
     SVGFilter(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode);
@@ -61,7 +60,6 @@ private:
     FloatRect m_absoluteFilterRegion;
     FloatRect m_filterRegion;
     bool m_effectBBoxMode;
-    FloatSize m_maxImageSize;
 };
 
 } // namespace WebCore

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list