diff options
Diffstat (limited to 'WebCore/svg/graphics/filters/SVGFilter.cpp')
-rw-r--r-- | WebCore/svg/graphics/filters/SVGFilter.cpp | 51 |
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 |