diff options
Diffstat (limited to 'WebCore/svg/graphics/SVGResourceFilter.cpp')
-rw-r--r-- | WebCore/svg/graphics/SVGResourceFilter.cpp | 38 |
1 files changed, 15 insertions, 23 deletions
diff --git a/WebCore/svg/graphics/SVGResourceFilter.cpp b/WebCore/svg/graphics/SVGResourceFilter.cpp index 4a4bdd5..973743c 100644 --- a/WebCore/svg/graphics/SVGResourceFilter.cpp +++ b/WebCore/svg/graphics/SVGResourceFilter.cpp @@ -31,52 +31,44 @@ #include "PlatformString.h" #include "SVGFilter.h" #include "SVGFilterBuilder.h" +#include "SVGFilterElement.h" #include "SVGRenderTreeAsText.h" #include "SVGFilterPrimitiveStandardAttributes.h" namespace WebCore { -SVGResourceFilter::SVGResourceFilter() - : m_filterBBoxMode(false) +SVGResourceFilter::SVGResourceFilter(const SVGFilterElement* ownerElement) + : SVGResource() + , m_ownerElement(ownerElement) + , m_filterBBoxMode(false) , m_effectBBoxMode(false) - , m_xBBoxMode(false) - , m_yBBoxMode(false) , m_savedContext(0) , m_sourceGraphicBuffer(0) { m_filterBuilder.set(new SVGFilterBuilder()); } -void SVGResourceFilter::addFilterEffect(SVGFilterPrimitiveStandardAttributes* effectAttributes, PassRefPtr<FilterEffect> effect) +SVGResourceFilter::~SVGResourceFilter() { - effectAttributes->setStandardAttributes(this, effect.get()); - builder()->add(effectAttributes->result(), effect); } -FloatRect SVGResourceFilter::filterBBoxForItemBBox(const FloatRect& itemBBox) const +void SVGResourceFilter::addFilterEffect(SVGFilterPrimitiveStandardAttributes* effectAttributes, PassRefPtr<FilterEffect> effect) { - FloatRect filterBBox = filterRect(); - - if (filterBoundingBoxMode()) - filterBBox = FloatRect(itemBBox.x() + filterBBox.x() * itemBBox.width(), - itemBBox.y() + filterBBox.y() * itemBBox.height(), - filterBBox.width() * itemBBox.width(), - filterBBox.height() * itemBBox.height()); - - return filterBBox; + effectAttributes->setStandardAttributes(this, effect.get()); + builder()->add(effectAttributes->result(), effect); } void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const RenderObject* object) { - m_itemBBox = object->objectBoundingBox(); - m_filterBBox = filterBBoxForItemBBox(m_itemBBox); + FloatRect targetRect = object->objectBoundingBox(); + m_ownerElement->buildFilter(targetRect); // clip sourceImage to filterRegion - FloatRect clippedSourceRect = m_itemBBox; + FloatRect clippedSourceRect = targetRect; clippedSourceRect.intersect(m_filterBBox); // prepare Filters - m_filter = SVGFilter::create(m_itemBBox, m_filterBBox, m_effectBBoxMode, m_filterBBoxMode); + m_filter = SVGFilter::create(targetRect, m_filterBBox, m_effectBBoxMode); FilterEffect* lastEffect = m_filterBuilder->lastEffect(); if (lastEffect) @@ -91,8 +83,8 @@ void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const RenderObj return; GraphicsContext* sourceGraphicContext = sourceGraphic->context(); - sourceGraphicContext->translate(-m_itemBBox.x(), -m_itemBBox.y()); - sourceGraphicContext->clearRect(FloatRect(FloatPoint(), m_itemBBox.size())); + sourceGraphicContext->translate(-targetRect.x(), -targetRect.y()); + sourceGraphicContext->clearRect(FloatRect(FloatPoint(), targetRect.size())); m_sourceGraphicBuffer.set(sourceGraphic.release()); m_savedContext = context; |