summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/filters/FilterEffect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/filters/FilterEffect.cpp')
-rw-r--r--WebCore/platform/graphics/filters/FilterEffect.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/WebCore/platform/graphics/filters/FilterEffect.cpp b/WebCore/platform/graphics/filters/FilterEffect.cpp
index 461b22a..121b921 100644
--- a/WebCore/platform/graphics/filters/FilterEffect.cpp
+++ b/WebCore/platform/graphics/filters/FilterEffect.cpp
@@ -46,7 +46,7 @@ FloatRect FilterEffect::determineFilterPrimitiveSubregion(Filter* filter)
// FETurbulence, FEImage and FEFlood don't have input effects, take the filter region as unite rect.
if (!size)
- uniteRect = filter->filterRegion();
+ uniteRect = filter->filterRegionInUserSpace();
else {
for (unsigned i = 0; i < size; ++i)
uniteRect.unite(m_inputEffects.at(i)->determineFilterPrimitiveSubregion(filter));
@@ -56,18 +56,29 @@ FloatRect FilterEffect::determineFilterPrimitiveSubregion(Filter* filter)
return m_filterPrimitiveSubregion;
}
-IntRect FilterEffect::requestedRegionOfInputImageData(const FloatRect& effectRect) const
+void FilterEffect::determineAbsolutePaintRect(Filter*)
+{
+ m_absolutePaintRect = IntRect();
+ unsigned size = m_inputEffects.size();
+ for (unsigned i = 0; i < size; ++i)
+ m_absolutePaintRect.unite(m_inputEffects.at(i)->absolutePaintRect());
+
+ // SVG specification wants us to clip to primitive subregion.
+ m_absolutePaintRect.intersect(m_maxEffectRect);
+}
+
+IntRect FilterEffect::requestedRegionOfInputImageData(const IntRect& effectRect) const
{
ASSERT(m_effectBuffer);
- FloatPoint location = m_repaintRectInLocalCoordinates.location();
+ IntPoint location = m_absolutePaintRect.location();
location.move(-effectRect.x(), -effectRect.y());
- return IntRect(roundedIntPoint(location), m_effectBuffer->size());
+ return IntRect(location, m_effectBuffer->size());
}
-FloatRect FilterEffect::drawingRegionOfInputImage(const FloatRect& srcRect) const
+IntRect FilterEffect::drawingRegionOfInputImage(const IntRect& srcRect) const
{
- return FloatRect(FloatPoint(srcRect.x() - m_repaintRectInLocalCoordinates.x(),
- srcRect.y() - m_repaintRectInLocalCoordinates.y()), srcRect.size());
+ return IntRect(IntPoint(srcRect.x() - m_absolutePaintRect.x(),
+ srcRect.y() - m_absolutePaintRect.y()), srcRect.size());
}
FilterEffect* FilterEffect::inputEffect(unsigned number) const
@@ -76,10 +87,12 @@ FilterEffect* FilterEffect::inputEffect(unsigned number) const
return m_inputEffects.at(number).get();
}
-GraphicsContext* FilterEffect::effectContext()
+GraphicsContext* FilterEffect::effectContext(Filter* filter)
{
- IntRect bufferRect = enclosingIntRect(m_repaintRectInLocalCoordinates);
- m_effectBuffer = ImageBuffer::create(bufferRect.size(), LinearRGB);
+ determineAbsolutePaintRect(filter);
+ if (m_absolutePaintRect.isEmpty())
+ return 0;
+ m_effectBuffer = ImageBuffer::create(m_absolutePaintRect.size(), ColorSpaceLinearRGB);
if (!m_effectBuffer)
return 0;
return m_effectBuffer->context();