diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/svg/graphics')
20 files changed, 189 insertions, 32 deletions
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp index 2157144..227b570 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp @@ -95,7 +95,7 @@ SVGImage::~SVGImage() } // Verify that page teardown destroyed the Chrome - ASSERT(!m_chromeClient->image()); + ASSERT(!m_chromeClient || !m_chromeClient->image()); } void SVGImage::setContainerSize(const IntSize& containerSize) diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp index 6c1dccb..0dd4e0a 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp @@ -66,50 +66,55 @@ FloatRect SVGResourceFilter::filterBBoxForItemBBox(const FloatRect& itemBBox) co return filterBBox; } -void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const FloatRect& itemRect) +void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const RenderObject* object) { + m_itemBBox = object->objectBoundingBox(); + m_filterBBox = filterBBoxForItemBBox(m_itemBBox); + + // clip sourceImage to filterRegion + FloatRect clippedSourceRect = m_itemBBox; + clippedSourceRect.intersect(m_filterBBox); + + // prepare Filters + m_filter = SVGFilter::create(m_itemBBox, m_filterBBox, m_effectBBoxMode, m_filterBBoxMode); + + FilterEffect* lastEffect = m_filterBuilder->lastEffect(); + if (lastEffect) + lastEffect->calculateEffectRect(m_filter.get()); + // Draw the content of the current element and it's childs to a imageBuffer to get the SourceGraphic. - // The size of the SourceGraphic must match the size of the element, the filter is aplied to. - IntSize bufferSize = IntSize(itemRect.width(), itemRect.height()); - OwnPtr<ImageBuffer> sourceGraphic(ImageBuffer::create(bufferSize, false)); + // The size of the SourceGraphic is clipped to the size of the filterRegion. + IntRect bufferRect = enclosingIntRect(clippedSourceRect); + OwnPtr<ImageBuffer> sourceGraphic(ImageBuffer::create(bufferRect.size(), false)); if (!sourceGraphic.get()) return; GraphicsContext* sourceGraphicContext = sourceGraphic->context(); - sourceGraphicContext->translate(-itemRect.x(), -itemRect.y()); - sourceGraphicContext->clearRect(FloatRect(0, 0, itemRect.width(), itemRect.height())); + sourceGraphicContext->translate(-m_itemBBox.x(), -m_itemBBox.y()); + sourceGraphicContext->clearRect(FloatRect(FloatPoint(), m_itemBBox.size())); m_sourceGraphicBuffer.set(sourceGraphic.release()); m_savedContext = context; context = sourceGraphicContext; } -void SVGResourceFilter::applyFilter(GraphicsContext*& context, const FloatRect& itemRect) +void SVGResourceFilter::applyFilter(GraphicsContext*& context, const RenderObject*) { if (!m_savedContext) return; - FloatRect filterRect = filterBBoxForItemBBox(itemRect); - - setFilterBoundingBox(filterRect); - setItemBoundingBox(itemRect); - context = m_savedContext; m_savedContext = 0; FilterEffect* lastEffect = m_filterBuilder->lastEffect(); - if (lastEffect && !filterRect.isEmpty()) { - RefPtr<Filter> filter = SVGFilter::create(m_itemBBox, m_filterBBox, m_effectBBoxMode, m_filterBBoxMode); - filter->setSourceImage(m_sourceGraphicBuffer->image()); - lastEffect->apply(filter.get()); - - context->clip(filterRect); + if (lastEffect && !m_filterBBox.isEmpty() && !lastEffect->subRegion().isEmpty()) { + m_filter->setSourceImage(m_sourceGraphicBuffer.release()); + lastEffect->apply(m_filter.get()); if (lastEffect->resultImage()) - context->drawImage(lastEffect->resultImage()->image(), - lastEffect->subRegion()); + context->drawImage(lastEffect->resultImage()->image(), lastEffect->subRegion()); } m_sourceGraphicBuffer.clear(); diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h index d081b6b..ee1efca 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h @@ -29,11 +29,13 @@ #include "Image.h" #include "ImageBuffer.h" #include "FloatRect.h" +#include "RenderObject.h" #include "SVGFilterPrimitiveStandardAttributes.h" #include <wtf/OwnPtr.h> #include <wtf/PassOwnPtr.h> #include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> namespace WebCore { @@ -74,8 +76,8 @@ public: virtual TextStream& externalRepresentation(TextStream&) const; - void prepareFilter(GraphicsContext*&, const FloatRect&); - void applyFilter(GraphicsContext*&, const FloatRect&); + void prepareFilter(GraphicsContext*&, const RenderObject*); + void applyFilter(GraphicsContext*&, const RenderObject*); void addFilterEffect(SVGFilterPrimitiveStandardAttributes*, PassRefPtr<FilterEffect>); @@ -97,6 +99,7 @@ private: OwnPtr<SVGFilterBuilder> m_filterBuilder; GraphicsContext* m_savedContext; OwnPtr<ImageBuffer> m_sourceGraphicBuffer; + RefPtr<Filter> m_filter; }; SVGResourceFilter* getFilterById(Document*, const AtomicString&); diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h index 9b3b33f..f850412 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h @@ -68,6 +68,7 @@ namespace WebCore { bool preserveAlpha() const; void setPreserveAlpha(bool); + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get(), m_in2.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h index f4b4dad..71f8e22 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h @@ -55,6 +55,7 @@ namespace WebCore { const LightSource* lightSource() const; void setLightSource(LightSource*); + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h index 1fd6db9..007f6ba 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h @@ -51,6 +51,7 @@ namespace WebCore { float scale() const; void setScale(float scale); + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get(), m_in2.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp index 9bdb8ca..3f4a6d7 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp @@ -2,6 +2,7 @@ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005 Rob Buis <buis@kde.org> 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -23,7 +24,9 @@ #if ENABLE(SVG) && ENABLE(FILTERS) #include "SVGFEFlood.h" + #include "Filter.h" +#include "GraphicsContext.h" #include "SVGRenderTreeAsText.h" namespace WebCore { @@ -63,6 +66,12 @@ void FEFlood::setFloodOpacity(float floodOpacity) void FEFlood::apply(Filter*) { + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + Color color = colorWithOverrideAlpha(floodColor().rgb(), floodOpacity()); + filterContext->fillRect(FloatRect(FloatPoint(), subRegion().size()), color); } void FEFlood::dump() diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h index a377f89..69f1cc5 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h @@ -38,6 +38,7 @@ namespace WebCore { float stdDeviationY() const; void setStdDeviationY(float); + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.cpp index a01ad3b..e82328a 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.cpp @@ -32,6 +32,7 @@ FEImage::FEImage(CachedImage* cachedImage) : FilterEffect() , m_cachedImage(cachedImage) { + m_cachedImage->addClient(this); } PassRefPtr<FEImage> FEImage::create(CachedImage* cachedImage) diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.h index 3fdc26a..f29d266 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.h @@ -41,7 +41,7 @@ namespace WebCore { CachedImage* cachedImage() const; void setCachedImage(CachedImage*); - + void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.cpp index 7f12c4c..acf3c45 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.cpp @@ -23,8 +23,10 @@ #if ENABLE(SVG) && ENABLE(FILTERS) #include "SVGFEMerge.h" -#include "SVGRenderTreeAsText.h" + #include "Filter.h" +#include "GraphicsContext.h" +#include "SVGRenderTreeAsText.h" namespace WebCore { @@ -49,8 +51,36 @@ void FEMerge::setMergeInputs(const Vector<FilterEffect*>& mergeInputs) m_mergeInputs = mergeInputs; } -void FEMerge::apply(Filter*) +FloatRect FEMerge::uniteChildEffectSubregions(Filter* filter) +{ + ASSERT(!m_mergeInputs.isEmpty()); + + FloatRect uniteEffectRect = m_mergeInputs[0]->calculateEffectRect(filter); + + for (unsigned i = 1; i < m_mergeInputs.size(); i++) + uniteEffectRect.unite(m_mergeInputs[i]->calculateEffectRect(filter)); + + return uniteEffectRect; +} + +void FEMerge::apply(Filter* filter) { + ASSERT(!m_mergeInputs.isEmpty()); + + for (unsigned i = 0; i < m_mergeInputs.size(); i++) { + m_mergeInputs[i]->apply(filter); + if (!m_mergeInputs[i]->resultImage()) + return; + } + + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + for (unsigned i = 0; i < m_mergeInputs.size(); i++) { + FloatRect destRect = calculateDrawingRect(m_mergeInputs[i]->subRegion()); + filterContext->drawImage(m_mergeInputs[i]->resultImage()->image(), destRect); + } } void FEMerge::dump() diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.h index e41e554..02fbfac 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.h @@ -35,7 +35,8 @@ namespace WebCore { const Vector<FilterEffect*>& mergeInputs() const; void setMergeInputs(const Vector<FilterEffect*>& mergeInputs); - + + virtual FloatRect uniteChildEffectSubregions(Filter*); void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h index 1db8bc4..bdc2b9b 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h @@ -46,6 +46,7 @@ namespace WebCore { float radiusY() const; void setRadiusY(float); + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.cpp index 63775fb..ce9ee3d 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.cpp @@ -2,6 +2,7 @@ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005 Rob Buis <buis@kde.org> 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -23,8 +24,10 @@ #if ENABLE(SVG) && ENABLE(FILTERS) #include "SVGFEOffset.h" -#include "SVGRenderTreeAsText.h" + #include "Filter.h" +#include "GraphicsContext.h" +#include "SVGRenderTreeAsText.h" namespace WebCore { @@ -61,8 +64,27 @@ void FEOffset::setDy(float dy) m_dy = dy; } -void FEOffset::apply(Filter*) +void FEOffset::apply(Filter* filter) { + m_in->apply(filter); + if (!m_in->resultImage()) + return; + + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + if (filter->effectBoundingBoxMode()) { + setDx(dx() * filter->sourceImageRect().width()); + setDy(dy() * filter->sourceImageRect().height()); + } + + FloatRect dstRect = FloatRect(dx() + m_in->subRegion().x() - subRegion().x(), + dy() + m_in->subRegion().y() - subRegion().y(), + m_in->subRegion().width(), + m_in->subRegion().height()); + + filterContext->drawImage(m_in->resultImage()->image(), dstRect); } void FEOffset::dump() diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.h index 93bdde9..8435db1 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.h @@ -38,6 +38,7 @@ namespace WebCore { float dy() const; void setDy(float); + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.h index 4efff93..dec5163 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.h @@ -57,6 +57,7 @@ namespace WebCore { const LightSource* lightSource() const; void setLightSource(LightSource*); + virtual FloatRect uniteEffectRect(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.cpp index fecd105..4d7ddf0 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.cpp @@ -1,5 +1,6 @@ /* Copyright (C) 2008 Alex Mathews <possessedpenguinbob@gmail.com> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -21,8 +22,12 @@ #if ENABLE(SVG) && ENABLE(FILTERS) #include "SVGFETile.h" -#include "SVGRenderTreeAsText.h" + #include "Filter.h" +#include "GraphicsContext.h" +#include "Pattern.h" +#include "TransformationMatrix.h" +#include "SVGRenderTreeAsText.h" namespace WebCore { @@ -37,8 +42,40 @@ PassRefPtr<FETile> FETile::create(FilterEffect* in) return adoptRef(new FETile(in)); } -void FETile::apply(Filter*) +FloatRect FETile::uniteChildEffectSubregions(Filter* filter) +{ + m_in->calculateEffectRect(filter); + return filter->filterRegion(); +} + +void FETile::apply(Filter* filter) { + m_in->apply(filter); + if (!m_in->resultImage()) + return; + + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + IntRect tileRect = enclosingIntRect(m_in->subRegion()); + + // Source input needs more attention. It has the size of the filterRegion but gives the + // size of the cutted sourceImage back. This is part of the specification and optimization. + if (m_in->isSourceInput()) + tileRect = enclosingIntRect(filter->filterRegion()); + + OwnPtr<ImageBuffer> tileImage = ImageBuffer::create(tileRect.size(), false); + GraphicsContext* tileImageContext = tileImage->context(); + tileImageContext->drawImage(m_in->resultImage()->image(), IntPoint()); + RefPtr<Pattern> pattern = Pattern::create(tileImage->image(), true, true); + + TransformationMatrix matrix; + matrix.translate(m_in->subRegion().x() - subRegion().x(), m_in->subRegion().y() - subRegion().y()); + pattern.get()->setPatternSpaceTransform(matrix); + + filterContext->setFillPattern(pattern); + filterContext->fillRect(FloatRect(FloatPoint(), subRegion().size())); } void FETile::dump() diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.h index f1e8d1a..c845085 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.h @@ -32,6 +32,7 @@ namespace WebCore { public: static PassRefPtr<FETile> create(FilterEffect*); + virtual FloatRect uniteChildEffectSubregions(Filter*); void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream& ts) const; diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp index 71c00eb..c892ee9 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp @@ -33,8 +33,45 @@ SVGFilter::SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool { } -void SVGFilter::calculateEffectSubRegion(FilterEffect*) +void SVGFilter::calculateEffectSubRegion(FilterEffect* effect) { + FloatRect subRegionBBox = effect->subRegion(); + FloatRect useBBox = effect->unionOfChildEffectSubregions(); + + FloatRect newSubRegion = subRegionBBox; + + if (m_effectBBoxMode) { + newSubRegion = useBBox; + + if (effect->hasX()) + newSubRegion.setX(m_itemBox.x() + subRegionBBox.x() * m_itemBox.width()); + + if (effect->hasY()) + newSubRegion.setY(m_itemBox.y() + subRegionBBox.y() * m_itemBox.height()); + + if (effect->hasWidth()) + newSubRegion.setWidth(subRegionBBox.width() * m_itemBox.width()); + + if (effect->hasHeight()) + newSubRegion.setHeight(subRegionBBox.height() * m_itemBox.height()); + } else { + if (effect->xBoundingBoxMode()) + newSubRegion.setX(useBBox.x() + subRegionBBox.x() * useBBox.width()); + + if (effect->yBoundingBoxMode()) + newSubRegion.setY(useBBox.y() + subRegionBBox.y() * useBBox.height()); + + if (effect->widthBoundingBoxMode()) + newSubRegion.setWidth(subRegionBBox.width() * useBBox.width()); + + if (effect->heightBoundingBoxMode()) + newSubRegion.setHeight(subRegionBBox.height() * useBBox.height()); + } + + // clip every filter effect to the filter region + newSubRegion.intersect(m_filterRect); + + effect->setSubRegion(newSubRegion); } PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode, bool filterBBoxMode) diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h index 95b3414..d6e5f77 100644 --- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h +++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h @@ -35,6 +35,10 @@ namespace WebCore { public: static PassRefPtr<SVGFilter> create(const FloatRect&, const FloatRect&, bool, bool); + bool effectBoundingBoxMode() { return m_effectBBoxMode; } + + FloatRect filterRegion() { return m_filterRect; } + FloatRect sourceImageRect() { return m_itemBox; } void calculateEffectSubRegion(FilterEffect*); private: |