summaryrefslogtreecommitdiffstats
path: root/WebCore/svg/graphics/filters/SVGFilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/svg/graphics/filters/SVGFilter.cpp')
-rw-r--r--WebCore/svg/graphics/filters/SVGFilter.cpp51
1 files changed, 41 insertions, 10 deletions
diff --git a/WebCore/svg/graphics/filters/SVGFilter.cpp b/WebCore/svg/graphics/filters/SVGFilter.cpp
index d72dc3d..dfdccd7 100644
--- a/WebCore/svg/graphics/filters/SVGFilter.cpp
+++ b/WebCore/svg/graphics/filters/SVGFilter.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
+ * Copyright (C) Research In Motion Limited 2010. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -22,14 +23,19 @@
#if ENABLE(SVG) && ENABLE(FILTERS)
#include "SVGFilter.h"
+#include "SVGFEImage.h"
+
namespace WebCore {
-SVGFilter::SVGFilter(const FloatRect& targetBoundingBox, const FloatRect& filterRect, bool effectBBoxMode)
+SVGFilter::SVGFilter(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode)
: Filter()
+ , m_absoluteTransform(absoluteTransform)
+ , m_absoluteSourceDrawingRegion(absoluteSourceDrawingRegion)
, m_targetBoundingBox(targetBoundingBox)
- , m_filterRect(filterRect)
+ , m_filterRegion(filterRegion)
, m_effectBBoxMode(effectBBoxMode)
{
+ m_absoluteFilterRegion = absoluteTransform.mapRect(filterRegion);
}
void SVGFilter::determineFilterPrimitiveSubregion(FilterEffect* effect, const FloatRect& unionOfPreviousPrimitiveSubregions)
@@ -65,23 +71,48 @@ void SVGFilter::determineFilterPrimitiveSubregion(FilterEffect* effect, const Fl
newSubRegion.setHeight(unionOfPreviousPrimitiveSubregions.height());
}
- // clip every filter effect to the filter region
- newSubRegion.intersect(m_filterRect);
-
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());
- effect->setRepaintRectInLocalCoordinates(newSubRegion);
- m_maxImageSize = m_maxImageSize.expandedTo(newSubRegion.size());
+
+ // 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)
+ value *= m_targetBoundingBox.width();
+ return Filter::applyHorizontalScale(value) * m_absoluteFilterRegion.width() / m_filterRegion.width();
+}
+
+float SVGFilter::applyVerticalScale(float value) const
+{
+ if (m_effectBBoxMode)
+ value *= m_targetBoundingBox.height();
+ return Filter::applyVerticalScale(value) * m_absoluteFilterRegion.height() / m_filterRegion.height();
}
-PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& targetBoundingBox, const FloatRect& filterRect, bool effectBBoxMode)
+PassRefPtr<SVGFilter> SVGFilter::create(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode)
{
- return adoptRef(new SVGFilter(targetBoundingBox, filterRect, effectBBoxMode));
+ return adoptRef(new SVGFilter(absoluteTransform, absoluteSourceDrawingRegion, targetBoundingBox, filterRegion, effectBBoxMode));
}
} // namespace WebCore