summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/webkit/WebCore/svg/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/webkit/WebCore/svg/graphics')
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.cpp34
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h4
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: