[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