diff options
Diffstat (limited to 'WebCore/svg/graphics')
22 files changed, 150 insertions, 188 deletions
diff --git a/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.cpp b/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.cpp index c1a1166..2dbc7ab 100644 --- a/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.cpp +++ b/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.cpp @@ -33,11 +33,10 @@ namespace WebCore { -FEConvolveMatrix::FEConvolveMatrix(FilterEffect* in, const IntSize& kernelSize, +FEConvolveMatrix::FEConvolveMatrix(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMode, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix) : FilterEffect() - , m_in(in) , m_kernelSize(kernelSize) , m_divisor(divisor) , m_bias(bias) @@ -49,11 +48,11 @@ FEConvolveMatrix::FEConvolveMatrix(FilterEffect* in, const IntSize& kernelSize, { } -PassRefPtr<FEConvolveMatrix> FEConvolveMatrix::create(FilterEffect* in, const IntSize& kernelSize, +PassRefPtr<FEConvolveMatrix> FEConvolveMatrix::create(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMode, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix) { - return adoptRef(new FEConvolveMatrix(in, kernelSize, divisor, bias, targetOffset, edgeMode, kernelUnitLength, + return adoptRef(new FEConvolveMatrix(kernelSize, divisor, bias, targetOffset, edgeMode, kernelUnitLength, preserveAlpha, kernelMatrix)); } @@ -374,21 +373,22 @@ ALWAYS_INLINE void FEConvolveMatrix::setOuterPixels(PaintingData& paintingData, void FEConvolveMatrix::apply(Filter* filter) { - m_in->apply(filter); - if (!m_in->resultImage()) + FilterEffect* in = inputEffect(0); + in->apply(filter); + if (!in->resultImage()) return; if (!getEffectContext()) return; IntRect imageRect(IntPoint(), resultImage()->size()); - IntRect effectDrawingRect = calculateDrawingIntRect(m_in->subRegion()); + IntRect effectDrawingRect = calculateDrawingIntRect(in->filterPrimitiveSubregion()); RefPtr<CanvasPixelArray> srcPixelArray; if (m_preserveAlpha) - srcPixelArray = m_in->resultImage()->getUnmultipliedImageData(effectDrawingRect)->data(); + srcPixelArray = in->resultImage()->getUnmultipliedImageData(effectDrawingRect)->data(); else - srcPixelArray = m_in->resultImage()->getPremultipliedImageData(effectDrawingRect)->data(); + srcPixelArray = in->resultImage()->getPremultipliedImageData(effectDrawingRect)->data(); RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height()); @@ -463,7 +463,7 @@ TextStream& FEConvolveMatrix::externalRepresentation(TextStream& ts, int indent) << "edgeMode=\"" << m_edgeMode << "\" " << "kernelUnitLength=\"" << m_kernelUnitLength << "\" " << "preserveAlpha=\"" << m_preserveAlpha << "\"]\n"; - m_in->externalRepresentation(ts, indent + 1); + inputEffect(0)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h b/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h index 662d097..736933c 100644 --- a/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h +++ b/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h @@ -44,7 +44,7 @@ class CanvasPixelArray; class FEConvolveMatrix : public FilterEffect { public: - static PassRefPtr<FEConvolveMatrix> create(FilterEffect*, const IntSize&, + static PassRefPtr<FEConvolveMatrix> create(const IntSize&, float, float, const IntPoint&, EdgeModeType, const FloatPoint&, bool, const Vector<float>&); @@ -72,13 +72,12 @@ public: bool preserveAlpha() const; void setPreserveAlpha(bool); - virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream&, int indent) const; private: - FEConvolveMatrix(FilterEffect*, const IntSize&, float, float, + FEConvolveMatrix(const IntSize&, float, float, const IntPoint&, EdgeModeType, const FloatPoint&, bool, const Vector<float>&); struct PaintingData { @@ -101,7 +100,6 @@ private: ALWAYS_INLINE void setInteriorPixels(PaintingData& paintingData, int clipRight, int clipBottom); ALWAYS_INLINE void setOuterPixels(PaintingData& paintingData, int x1, int y1, int x2, int y2); - RefPtr<FilterEffect> m_in; IntSize m_kernelSize; float m_divisor; float m_bias; diff --git a/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.cpp b/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.cpp index 3a008fa..b439c46 100644 --- a/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.cpp +++ b/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.cpp @@ -29,17 +29,17 @@ namespace WebCore { -FEDiffuseLighting::FEDiffuseLighting(FilterEffect* in, const Color& lightingColor, float surfaceScale, +FEDiffuseLighting::FEDiffuseLighting(const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, PassRefPtr<LightSource> lightSource) - : FELighting(DiffuseLighting, in, lightingColor, surfaceScale, diffuseConstant, 0.0f, 0.0f, kernelUnitLengthX, kernelUnitLengthY, lightSource) + : FELighting(DiffuseLighting, lightingColor, surfaceScale, diffuseConstant, 0, 0, kernelUnitLengthX, kernelUnitLengthY, lightSource) { } -PassRefPtr<FEDiffuseLighting> FEDiffuseLighting::create(FilterEffect* in , const Color& lightingColor, +PassRefPtr<FEDiffuseLighting> FEDiffuseLighting::create(const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, PassRefPtr<LightSource> lightSource) { - return adoptRef(new FEDiffuseLighting(in, lightingColor, surfaceScale, diffuseConstant, kernelUnitLengthX, kernelUnitLengthY, lightSource)); + return adoptRef(new FEDiffuseLighting(lightingColor, surfaceScale, diffuseConstant, kernelUnitLengthX, kernelUnitLengthY, lightSource)); } FEDiffuseLighting::~FEDiffuseLighting() @@ -118,7 +118,7 @@ TextStream& FEDiffuseLighting::externalRepresentation(TextStream& ts, int indent ts << " surfaceScale=\"" << m_surfaceScale << "\" " << "diffuseConstant=\"" << m_diffuseConstant << "\" " << "kernelUnitLength=\"" << m_kernelUnitLengthX << ", " << m_kernelUnitLengthY << "\"]\n"; - m_in->externalRepresentation(ts, indent + 1); + inputEffect(0)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h b/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h index ee4d5b1..0cdeae3 100644 --- a/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h +++ b/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h @@ -31,7 +31,7 @@ class LightSource; class FEDiffuseLighting : public FELighting { public: - static PassRefPtr<FEDiffuseLighting> create(FilterEffect*, const Color&, float, float, + static PassRefPtr<FEDiffuseLighting> create(const Color&, float, float, float, float, PassRefPtr<LightSource>); virtual ~FEDiffuseLighting(); @@ -57,7 +57,7 @@ public: TextStream& externalRepresentation(TextStream&, int indent) const; private: - FEDiffuseLighting(FilterEffect*, const Color&, float, float, + FEDiffuseLighting(const Color&, float, float, float, float, PassRefPtr<LightSource>); }; diff --git a/WebCore/svg/graphics/filters/SVGFEDisplacementMap.cpp b/WebCore/svg/graphics/filters/SVGFEDisplacementMap.cpp index 3305f27..9d9857e 100644 --- a/WebCore/svg/graphics/filters/SVGFEDisplacementMap.cpp +++ b/WebCore/svg/graphics/filters/SVGFEDisplacementMap.cpp @@ -33,21 +33,18 @@ namespace WebCore { -FEDisplacementMap::FEDisplacementMap(FilterEffect* in, FilterEffect* in2, ChannelSelectorType xChannelSelector, - ChannelSelectorType yChannelSelector, const float& scale) +FEDisplacementMap::FEDisplacementMap(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float scale) : FilterEffect() - , m_in(in) - , m_in2(in2) , m_xChannelSelector(xChannelSelector) , m_yChannelSelector(yChannelSelector) , m_scale(scale) { } -PassRefPtr<FEDisplacementMap> FEDisplacementMap::create(FilterEffect* in, FilterEffect* in2, - ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, const float& scale) +PassRefPtr<FEDisplacementMap> FEDisplacementMap::create(ChannelSelectorType xChannelSelector, + ChannelSelectorType yChannelSelector, float scale) { - return adoptRef(new FEDisplacementMap(in, in2, xChannelSelector, yChannelSelector, scale)); + return adoptRef(new FEDisplacementMap(xChannelSelector, yChannelSelector, scale)); } ChannelSelectorType FEDisplacementMap::xChannelSelector() const @@ -82,9 +79,11 @@ void FEDisplacementMap::setScale(float scale) void FEDisplacementMap::apply(Filter* filter) { - m_in->apply(filter); - m_in2->apply(filter); - if (!m_in->resultImage() || !m_in2->resultImage()) + FilterEffect* in = inputEffect(0); + FilterEffect* in2 = inputEffect(1); + in->apply(filter); + in2->apply(filter); + if (!in->resultImage() || !in2->resultImage()) return; if (m_xChannelSelector == CHANNEL_UNKNOWN || m_yChannelSelector == CHANNEL_UNKNOWN) @@ -93,11 +92,11 @@ void FEDisplacementMap::apply(Filter* filter) if (!getEffectContext()) return; - IntRect effectADrawingRect = calculateDrawingIntRect(m_in->scaledSubRegion()); - RefPtr<CanvasPixelArray> srcPixelArrayA(m_in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data()); + IntRect effectADrawingRect = calculateDrawingIntRect(in->repaintRectInLocalCoordinates()); + RefPtr<CanvasPixelArray> srcPixelArrayA(in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data()); - IntRect effectBDrawingRect = calculateDrawingIntRect(m_in2->scaledSubRegion()); - RefPtr<CanvasPixelArray> srcPixelArrayB(m_in2->resultImage()->getUnmultipliedImageData(effectBDrawingRect)->data()); + IntRect effectBDrawingRect = calculateDrawingIntRect(in2->repaintRectInLocalCoordinates()); + RefPtr<CanvasPixelArray> srcPixelArrayB(in2->resultImage()->getUnmultipliedImageData(effectBDrawingRect)->data()); IntRect imageRect(IntPoint(), resultImage()->size()); RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height()); @@ -163,8 +162,8 @@ TextStream& FEDisplacementMap::externalRepresentation(TextStream& ts, int indent ts << " scale=\"" << m_scale << "\" " << "xChannelSelector=\"" << m_xChannelSelector << "\" " << "yChannelSelector=\"" << m_yChannelSelector << "\"]\n"; - m_in->externalRepresentation(ts, indent + 1); - m_in2->externalRepresentation(ts, indent + 1); + inputEffect(0)->externalRepresentation(ts, indent + 1); + inputEffect(1)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h b/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h index 7bb9d19..9e17da4 100644 --- a/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h +++ b/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h @@ -39,8 +39,7 @@ namespace WebCore { class FEDisplacementMap : public FilterEffect { public: - static PassRefPtr<FEDisplacementMap> create(FilterEffect*, FilterEffect*, ChannelSelectorType, - ChannelSelectorType, const float&); + static PassRefPtr<FEDisplacementMap> create(ChannelSelectorType, ChannelSelectorType, float); ChannelSelectorType xChannelSelector() const; void setXChannelSelector(const ChannelSelectorType); @@ -51,17 +50,13 @@ 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&, int indent) const; private: - FEDisplacementMap(FilterEffect*, FilterEffect*, ChannelSelectorType, - ChannelSelectorType, const float&); + FEDisplacementMap(ChannelSelectorType, ChannelSelectorType, float); - RefPtr<FilterEffect> m_in; - RefPtr<FilterEffect> m_in2; ChannelSelectorType m_xChannelSelector; ChannelSelectorType m_yChannelSelector; float m_scale; diff --git a/WebCore/svg/graphics/filters/SVGFEFlood.cpp b/WebCore/svg/graphics/filters/SVGFEFlood.cpp index 5286d80..a2b2cd2 100644 --- a/WebCore/svg/graphics/filters/SVGFEFlood.cpp +++ b/WebCore/svg/graphics/filters/SVGFEFlood.cpp @@ -70,7 +70,7 @@ void FEFlood::apply(Filter*) return; Color color = colorWithOverrideAlpha(floodColor().rgb(), floodOpacity()); - filterContext->fillRect(FloatRect(FloatPoint(), scaledSubRegion().size()), color, DeviceColorSpace); + filterContext->fillRect(FloatRect(FloatPoint(), repaintRectInLocalCoordinates().size()), color, DeviceColorSpace); } void FEFlood::dump() diff --git a/WebCore/svg/graphics/filters/SVGFEImage.cpp b/WebCore/svg/graphics/filters/SVGFEImage.cpp index b21ceae..a3ac882 100644 --- a/WebCore/svg/graphics/filters/SVGFEImage.cpp +++ b/WebCore/svg/graphics/filters/SVGFEImage.cpp @@ -55,7 +55,7 @@ void FEImage::apply(Filter*) return; FloatRect srcRect(FloatPoint(), m_image->size()); - FloatRect destRect(FloatPoint(), subRegion().size()); + FloatRect destRect(FloatPoint(), filterPrimitiveSubregion().size()); m_preserveAspectRatio.transformRect(destRect, srcRect); diff --git a/WebCore/svg/graphics/filters/SVGFELighting.cpp b/WebCore/svg/graphics/filters/SVGFELighting.cpp index 7c3c81c..dc82840 100644 --- a/WebCore/svg/graphics/filters/SVGFELighting.cpp +++ b/WebCore/svg/graphics/filters/SVGFELighting.cpp @@ -35,12 +35,11 @@ namespace WebCore { -FELighting::FELighting(LightingType lightingType, FilterEffect* in, const Color& lightingColor, float surfaceScale, +FELighting::FELighting(LightingType lightingType, const Color& lightingColor, float surfaceScale, float diffuseConstant, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, PassRefPtr<LightSource> lightSource) : FilterEffect() , m_lightingType(lightingType) - , m_in(in) , m_lightSource(lightSource) , m_lightingColor(lightingColor) , m_surfaceScale(surfaceScale) @@ -243,8 +242,9 @@ bool FELighting::drawLighting(CanvasPixelArray* pixels, int width, int height) void FELighting::apply(Filter* filter) { - m_in->apply(filter); - if (!m_in->resultImage()) + FilterEffect* in = inputEffect(0); + in->apply(filter); + if (!in->resultImage()) return; if (!getEffectContext()) @@ -252,8 +252,8 @@ void FELighting::apply(Filter* filter) setIsAlphaImage(false); - IntRect effectDrawingRect = calculateDrawingIntRect(m_in->scaledSubRegion()); - RefPtr<ImageData> srcImageData(m_in->resultImage()->getUnmultipliedImageData(effectDrawingRect)); + IntRect effectDrawingRect = calculateDrawingIntRect(in->repaintRectInLocalCoordinates()); + RefPtr<ImageData> srcImageData(in->resultImage()->getUnmultipliedImageData(effectDrawingRect)); CanvasPixelArray* srcPixelArray(srcImageData->data()); // FIXME: support kernelUnitLengths other than (1,1). The issue here is that the W3 diff --git a/WebCore/svg/graphics/filters/SVGFELighting.h b/WebCore/svg/graphics/filters/SVGFELighting.h index 7db50e0..55802ca 100644 --- a/WebCore/svg/graphics/filters/SVGFELighting.h +++ b/WebCore/svg/graphics/filters/SVGFELighting.h @@ -42,7 +42,6 @@ class CanvasPixelArray; class FELighting : public FilterEffect { public: - virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } void apply(Filter*); protected: @@ -72,15 +71,13 @@ protected: ALWAYS_INLINE int downRightPixelValue(); }; - FELighting(LightingType, FilterEffect*, const Color&, float, float, float, - float, float, float, PassRefPtr<LightSource>); + FELighting(LightingType, const Color&, float, float, float, float, float, float, PassRefPtr<LightSource>); bool drawLighting(CanvasPixelArray*, int, int); ALWAYS_INLINE void setPixel(LightingData&, LightSource::PaintingData&, int lightX, int lightY, float factorX, int normalX, float factorY, int normalY); LightingType m_lightingType; - RefPtr<FilterEffect> m_in; RefPtr<LightSource> m_lightSource; Color m_lightingColor; diff --git a/WebCore/svg/graphics/filters/SVGFEMerge.cpp b/WebCore/svg/graphics/filters/SVGFEMerge.cpp index 11c7407..e92ce4c 100644 --- a/WebCore/svg/graphics/filters/SVGFEMerge.cpp +++ b/WebCore/svg/graphics/filters/SVGFEMerge.cpp @@ -30,46 +30,24 @@ namespace WebCore { -FEMerge::FEMerge(const Vector<RefPtr<FilterEffect> >& mergeInputs) +FEMerge::FEMerge() : FilterEffect() - , m_mergeInputs(mergeInputs) { } -PassRefPtr<FEMerge> FEMerge::create(const Vector<RefPtr<FilterEffect> >& mergeInputs) +PassRefPtr<FEMerge> FEMerge::create() { - return adoptRef(new FEMerge(mergeInputs)); -} - -const Vector<RefPtr<FilterEffect> >& FEMerge::mergeInputs() const -{ - return m_mergeInputs; -} - -void FEMerge::setMergeInputs(const Vector<RefPtr<FilterEffect> >& mergeInputs) -{ - m_mergeInputs = mergeInputs; -} - -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; + return adoptRef(new FEMerge); } 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()) + unsigned size = numberOfEffectInputs(); + ASSERT(size > 0); + for (unsigned i = 0; i < size; ++i) { + FilterEffect* in = inputEffect(i); + in->apply(filter); + if (!in->resultImage()) return; } @@ -77,9 +55,9 @@ void FEMerge::apply(Filter* filter) if (!filterContext) return; - for (unsigned i = 0; i < m_mergeInputs.size(); i++) { - FloatRect destRect = calculateDrawingRect(m_mergeInputs[i]->scaledSubRegion()); - filterContext->drawImageBuffer(m_mergeInputs[i]->resultImage(), DeviceColorSpace, destRect); + for (unsigned i = 0; i < size; ++i) { + FilterEffect* in = inputEffect(i); + filterContext->drawImageBuffer(in->resultImage(), DeviceColorSpace, calculateDrawingRect(in->repaintRectInLocalCoordinates())); } } @@ -92,12 +70,11 @@ TextStream& FEMerge::externalRepresentation(TextStream& ts, int indent) const writeIndent(ts, indent); ts << "[feMerge"; FilterEffect::externalRepresentation(ts); - ts << " mergeNodes=\"" << m_mergeInputs.size() << "\"]\n"; - if (!m_mergeInputs.isEmpty()) { - const Vector<RefPtr<FilterEffect> >::const_iterator end = m_mergeInputs.end(); - for (Vector<RefPtr<FilterEffect> >::const_iterator it = m_mergeInputs.begin(); it != end; ++it) - (*it)->externalRepresentation(ts, indent + 1); - } + unsigned size = numberOfEffectInputs(); + ASSERT(size > 0); + ts << " mergeNodes=\"" << size << "\"]\n"; + for (unsigned i = 0; i < size; ++i) + inputEffect(i)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFEMerge.h b/WebCore/svg/graphics/filters/SVGFEMerge.h index 66decfc..439d789 100644 --- a/WebCore/svg/graphics/filters/SVGFEMerge.h +++ b/WebCore/svg/graphics/filters/SVGFEMerge.h @@ -31,20 +31,14 @@ namespace WebCore { class FEMerge : public FilterEffect { public: - static PassRefPtr<FEMerge> create(const Vector<RefPtr<FilterEffect> >&); + static PassRefPtr<FEMerge> create(); - const Vector<RefPtr<FilterEffect> >& mergeInputs() const; - void setMergeInputs(const Vector<RefPtr<FilterEffect> >& mergeInputs); - - virtual FloatRect uniteChildEffectSubregions(Filter*); void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream&, int indent) const; private: - FEMerge(const Vector<RefPtr<FilterEffect> >&); - - Vector<RefPtr<FilterEffect> > m_mergeInputs; + FEMerge(); }; } // namespace WebCore diff --git a/WebCore/svg/graphics/filters/SVGFEMorphology.cpp b/WebCore/svg/graphics/filters/SVGFEMorphology.cpp index 3fdf369..6645259 100644 --- a/WebCore/svg/graphics/filters/SVGFEMorphology.cpp +++ b/WebCore/svg/graphics/filters/SVGFEMorphology.cpp @@ -37,18 +37,17 @@ using std::max; namespace WebCore { -FEMorphology::FEMorphology(FilterEffect* in, MorphologyOperatorType type, float radiusX, float radiusY) +FEMorphology::FEMorphology(MorphologyOperatorType type, float radiusX, float radiusY) : FilterEffect() - , m_in(in) , m_type(type) , m_radiusX(radiusX) , m_radiusY(radiusY) { } -PassRefPtr<FEMorphology> FEMorphology::create(FilterEffect* in, MorphologyOperatorType type, float radiusX, float radiusY) +PassRefPtr<FEMorphology> FEMorphology::create(MorphologyOperatorType type, float radiusX, float radiusY) { - return adoptRef(new FEMorphology(in, type, radiusX, radiusY)); + return adoptRef(new FEMorphology(type, radiusX, radiusY)); } MorphologyOperatorType FEMorphology::morphologyOperator() const @@ -83,14 +82,15 @@ void FEMorphology::setRadiusY(float radiusY) void FEMorphology::apply(Filter* filter) { - m_in->apply(filter); - if (!m_in->resultImage()) + FilterEffect* in = inputEffect(0); + in->apply(filter); + if (!in->resultImage()) return; - + if (!getEffectContext()) return; - setIsAlphaImage(m_in->isAlphaImage()); + setIsAlphaImage(in->isAlphaImage()); int radiusX = static_cast<int>(m_radiusX * filter->filterResolution().width()); int radiusY = static_cast<int>(m_radiusY * filter->filterResolution().height()); @@ -98,8 +98,8 @@ void FEMorphology::apply(Filter* filter) return; IntRect imageRect(IntPoint(), resultImage()->size()); - IntRect effectDrawingRect = calculateDrawingIntRect(m_in->scaledSubRegion()); - RefPtr<CanvasPixelArray> srcPixelArray(m_in->resultImage()->getPremultipliedImageData(effectDrawingRect)->data()); + IntRect effectDrawingRect = calculateDrawingIntRect(in->repaintRectInLocalCoordinates()); + RefPtr<CanvasPixelArray> srcPixelArray(in->resultImage()->getPremultipliedImageData(effectDrawingRect)->data()); RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height()); int effectWidth = effectDrawingRect.width() * 4; @@ -179,8 +179,8 @@ TextStream& FEMorphology::externalRepresentation(TextStream& ts, int indent) con ts << "[feMorphology"; FilterEffect::externalRepresentation(ts); ts << " operator=\"" << morphologyOperator() << "\" " - << "radius=\"" << radiusX() << ", " << radiusY() << "\"]\n"; - m_in->externalRepresentation(ts, indent + 1); + << "radius=\"" << radiusX() << ", " << radiusY() << "\"]\n"; + inputEffect(0)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFEMorphology.h b/WebCore/svg/graphics/filters/SVGFEMorphology.h index 79f292d..9743d2b 100644 --- a/WebCore/svg/graphics/filters/SVGFEMorphology.h +++ b/WebCore/svg/graphics/filters/SVGFEMorphology.h @@ -36,7 +36,7 @@ namespace WebCore { class FEMorphology : public FilterEffect { public: - static PassRefPtr<FEMorphology> create(FilterEffect*, MorphologyOperatorType, float radiusX, float radiusY); + static PassRefPtr<FEMorphology> create(MorphologyOperatorType, float radiusX, float radiusY); MorphologyOperatorType morphologyOperator() const; void setMorphologyOperator(MorphologyOperatorType); @@ -46,15 +46,13 @@ 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&, int indent) const; private: - FEMorphology(FilterEffect*, MorphologyOperatorType, float radiusX, float radiusY); + FEMorphology(MorphologyOperatorType, float radiusX, float radiusY); - RefPtr<FilterEffect> m_in; MorphologyOperatorType m_type; float m_radiusX; float m_radiusY; diff --git a/WebCore/svg/graphics/filters/SVGFEOffset.cpp b/WebCore/svg/graphics/filters/SVGFEOffset.cpp index e12b8e0..685bd7b 100644 --- a/WebCore/svg/graphics/filters/SVGFEOffset.cpp +++ b/WebCore/svg/graphics/filters/SVGFEOffset.cpp @@ -31,17 +31,16 @@ namespace WebCore { -FEOffset::FEOffset(FilterEffect* in, const float& dx, const float& dy) +FEOffset::FEOffset(float dx, float dy) : FilterEffect() - , m_in(in) , m_dx(dx) , m_dy(dy) { } -PassRefPtr<FEOffset> FEOffset::create(FilterEffect* in, const float& dx, const float& dy) +PassRefPtr<FEOffset> FEOffset::create(float dx, float dy) { - return adoptRef(new FEOffset(in, dx, dy)); + return adoptRef(new FEOffset(dx, dy)); } float FEOffset::dx() const @@ -66,15 +65,16 @@ void FEOffset::setDy(float dy) void FEOffset::apply(Filter* filter) { - m_in->apply(filter); - if (!m_in->resultImage()) + FilterEffect* in = inputEffect(0); + in->apply(filter); + if (!in->resultImage()) return; GraphicsContext* filterContext = getEffectContext(); if (!filterContext) return; - setIsAlphaImage(m_in->isAlphaImage()); + setIsAlphaImage(in->isAlphaImage()); FloatRect sourceImageRect = filter->sourceImageRect(); sourceImageRect.scale(filter->filterResolution().width(), filter->filterResolution().height()); @@ -86,12 +86,12 @@ void FEOffset::apply(Filter* filter) m_dx *= filter->filterResolution().width(); m_dy *= filter->filterResolution().height(); - FloatRect dstRect = FloatRect(m_dx + m_in->scaledSubRegion().x() - scaledSubRegion().x(), - m_dy + m_in->scaledSubRegion().y() - scaledSubRegion().y(), - m_in->scaledSubRegion().width(), - m_in->scaledSubRegion().height()); + FloatRect dstRect = FloatRect(m_dx + in->repaintRectInLocalCoordinates().x() - repaintRectInLocalCoordinates().x(), + m_dy + in->repaintRectInLocalCoordinates().y() - repaintRectInLocalCoordinates().y(), + in->repaintRectInLocalCoordinates().width(), + in->repaintRectInLocalCoordinates().height()); - filterContext->drawImageBuffer(m_in->resultImage(), DeviceColorSpace, dstRect); + filterContext->drawImageBuffer(in->resultImage(), DeviceColorSpace, dstRect); } void FEOffset::dump() @@ -104,7 +104,7 @@ TextStream& FEOffset::externalRepresentation(TextStream& ts, int indent) const ts << "[feOffset"; FilterEffect::externalRepresentation(ts); ts << " dx=\"" << dx() << "\" dy=\"" << dy() << "\"]\n"; - m_in->externalRepresentation(ts, indent + 1); + inputEffect(0)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFEOffset.h b/WebCore/svg/graphics/filters/SVGFEOffset.h index ad071d6..34ed97b 100644 --- a/WebCore/svg/graphics/filters/SVGFEOffset.h +++ b/WebCore/svg/graphics/filters/SVGFEOffset.h @@ -30,7 +30,7 @@ namespace WebCore { class FEOffset : public FilterEffect { public: - static PassRefPtr<FEOffset> create(FilterEffect*, const float&, const float&); + static PassRefPtr<FEOffset> create(float, float); float dx() const; void setDx(float); @@ -38,15 +38,13 @@ 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&, int indent) const; private: - FEOffset(FilterEffect*, const float&, const float&); + FEOffset(float, float); - RefPtr<FilterEffect> m_in; float m_dx; float m_dy; }; diff --git a/WebCore/svg/graphics/filters/SVGFESpecularLighting.cpp b/WebCore/svg/graphics/filters/SVGFESpecularLighting.cpp index 5c6dc2a..33f7b6c 100644 --- a/WebCore/svg/graphics/filters/SVGFESpecularLighting.cpp +++ b/WebCore/svg/graphics/filters/SVGFESpecularLighting.cpp @@ -29,18 +29,18 @@ namespace WebCore { -FESpecularLighting::FESpecularLighting(FilterEffect* in, const Color& lightingColor, float surfaceScale, +FESpecularLighting::FESpecularLighting(const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, PassRefPtr<LightSource> lightSource) - : FELighting(SpecularLighting, in, lightingColor, surfaceScale, 0.0f, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, lightSource) + : FELighting(SpecularLighting, lightingColor, surfaceScale, 0, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, lightSource) { } -PassRefPtr<FESpecularLighting> FESpecularLighting::create(FilterEffect* in, const Color& lightingColor, +PassRefPtr<FESpecularLighting> FESpecularLighting::create(const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, PassRefPtr<LightSource> lightSource) { - return adoptRef(new FESpecularLighting(in, lightingColor, surfaceScale, specularConstant, specularExponent, + return adoptRef(new FESpecularLighting(lightingColor, surfaceScale, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, lightSource)); } @@ -130,7 +130,7 @@ TextStream& FESpecularLighting::externalRepresentation(TextStream& ts, int inden ts << " surfaceScale=\"" << m_surfaceScale << "\" " << "specualConstant=\"" << m_specularConstant << "\" " << "specularExponent=\"" << m_specularExponent << "\"]\n"; - m_in->externalRepresentation(ts, indent + 1); + inputEffect(0)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFESpecularLighting.h b/WebCore/svg/graphics/filters/SVGFESpecularLighting.h index 3a49c1e..6067a76 100644 --- a/WebCore/svg/graphics/filters/SVGFESpecularLighting.h +++ b/WebCore/svg/graphics/filters/SVGFESpecularLighting.h @@ -29,7 +29,7 @@ namespace WebCore { class FESpecularLighting : public FELighting { public: - static PassRefPtr<FESpecularLighting> create(FilterEffect*, const Color&, float, float, + static PassRefPtr<FESpecularLighting> create(const Color&, float, float, float, float, float, PassRefPtr<LightSource>); virtual ~FESpecularLighting(); @@ -58,8 +58,7 @@ public: TextStream& externalRepresentation(TextStream&, int indent) const; private: - FESpecularLighting(FilterEffect*, const Color&, float, float, float, - float, float, PassRefPtr<LightSource>); + FESpecularLighting(const Color&, float, float, float, float, float, PassRefPtr<LightSource>); }; } // namespace WebCore diff --git a/WebCore/svg/graphics/filters/SVGFETile.cpp b/WebCore/svg/graphics/filters/SVGFETile.cpp index 56cbc1e..80eb9b3 100644 --- a/WebCore/svg/graphics/filters/SVGFETile.cpp +++ b/WebCore/svg/graphics/filters/SVGFETile.cpp @@ -31,40 +31,42 @@ namespace WebCore { -FETile::FETile(FilterEffect* in) +FETile::FETile() : FilterEffect() - , m_in(in) { } -PassRefPtr<FETile> FETile::create(FilterEffect* in) +PassRefPtr<FETile> FETile::create() { - return adoptRef(new FETile(in)); + return adoptRef(new FETile); } -FloatRect FETile::uniteChildEffectSubregions(Filter* filter) +FloatRect FETile::determineFilterPrimitiveSubregion(Filter* filter) { - m_in->calculateEffectRect(filter); - return filter->filterRegion(); + inputEffect(0)->determineFilterPrimitiveSubregion(filter); + + filter->determineFilterPrimitiveSubregion(this, filter->filterRegion()); + return filterPrimitiveSubregion(); } void FETile::apply(Filter* filter) { - m_in->apply(filter); - if (!m_in->resultImage()) + FilterEffect* in = inputEffect(0); + in->apply(filter); + if (!in->resultImage()) return; GraphicsContext* filterContext = getEffectContext(); if (!filterContext) return; - setIsAlphaImage(m_in->isAlphaImage()); + setIsAlphaImage(in->isAlphaImage()); - IntRect tileRect = enclosingIntRect(m_in->scaledSubRegion()); + IntRect tileRect = enclosingIntRect(in->repaintRectInLocalCoordinates()); // 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()) { + if (in->isSourceInput()) { FloatRect filterRegion = filter->filterRegion(); filterRegion.scale(filter->filterResolution().width(), filter->filterResolution().height()); tileRect = enclosingIntRect(filterRegion); @@ -72,15 +74,16 @@ void FETile::apply(Filter* filter) OwnPtr<ImageBuffer> tileImage = ImageBuffer::create(tileRect.size()); GraphicsContext* tileImageContext = tileImage->context(); - tileImageContext->drawImageBuffer(m_in->resultImage(), DeviceColorSpace, IntPoint()); + tileImageContext->drawImageBuffer(in->resultImage(), DeviceColorSpace, IntPoint()); RefPtr<Pattern> pattern = Pattern::create(tileImage->copyImage(), true, true); AffineTransform matrix; - matrix.translate(m_in->scaledSubRegion().x() - scaledSubRegion().x(), m_in->scaledSubRegion().y() - scaledSubRegion().y()); + matrix.translate(in->repaintRectInLocalCoordinates().x() - repaintRectInLocalCoordinates().x(), + in->repaintRectInLocalCoordinates().y() - repaintRectInLocalCoordinates().y()); pattern.get()->setPatternSpaceTransform(matrix); filterContext->setFillPattern(pattern); - filterContext->fillRect(FloatRect(FloatPoint(), scaledSubRegion().size())); + filterContext->fillRect(FloatRect(FloatPoint(), repaintRectInLocalCoordinates().size())); } void FETile::dump() @@ -93,7 +96,7 @@ TextStream& FETile::externalRepresentation(TextStream& ts, int indent) const ts << "[feTile"; FilterEffect::externalRepresentation(ts); ts << "]\n"; - m_in->externalRepresentation(ts, indent + 1); + inputEffect(0)->externalRepresentation(ts, indent + 1); return ts; } diff --git a/WebCore/svg/graphics/filters/SVGFETile.h b/WebCore/svg/graphics/filters/SVGFETile.h index 7af9c13..128c9cb 100644 --- a/WebCore/svg/graphics/filters/SVGFETile.h +++ b/WebCore/svg/graphics/filters/SVGFETile.h @@ -30,17 +30,16 @@ namespace WebCore { class FETile : public FilterEffect { public: - static PassRefPtr<FETile> create(FilterEffect*); + static PassRefPtr<FETile> create(); - virtual FloatRect uniteChildEffectSubregions(Filter*); void apply(Filter*); void dump(); TextStream& externalRepresentation(TextStream&, int indent) const; + + virtual FloatRect determineFilterPrimitiveSubregion(Filter*); private: - FETile(FilterEffect*); - - RefPtr<FilterEffect> m_in; + FETile(); }; } // namespace WebCore diff --git a/WebCore/svg/graphics/filters/SVGFilter.cpp b/WebCore/svg/graphics/filters/SVGFilter.cpp index 947dbed..d72dc3d 100644 --- a/WebCore/svg/graphics/filters/SVGFilter.cpp +++ b/WebCore/svg/graphics/filters/SVGFilter.cpp @@ -24,60 +24,64 @@ namespace WebCore { -SVGFilter::SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode) +SVGFilter::SVGFilter(const FloatRect& targetBoundingBox, const FloatRect& filterRect, bool effectBBoxMode) : Filter() - , m_itemBox(itemBox) + , m_targetBoundingBox(targetBoundingBox) , m_filterRect(filterRect) , m_effectBBoxMode(effectBBoxMode) { } -void SVGFilter::calculateEffectSubRegion(FilterEffect* effect) +void SVGFilter::determineFilterPrimitiveSubregion(FilterEffect* effect, const FloatRect& unionOfPreviousPrimitiveSubregions) { FloatRect subRegionBBox = effect->effectBoundaries(); - FloatRect useBBox = effect->unionOfChildEffectSubregions(); FloatRect newSubRegion = subRegionBBox; if (m_effectBBoxMode) { - newSubRegion = useBBox; + newSubRegion = unionOfPreviousPrimitiveSubregions; if (effect->hasX()) - newSubRegion.setX(m_itemBox.x() + subRegionBBox.x() * m_itemBox.width()); + newSubRegion.setX(m_targetBoundingBox.x() + subRegionBBox.x() * m_targetBoundingBox.width()); - if (effect->hasY()) - newSubRegion.setY(m_itemBox.y() + subRegionBBox.y() * m_itemBox.height()); + if (effect->hasY()) + newSubRegion.setY(m_targetBoundingBox.y() + subRegionBBox.y() * m_targetBoundingBox.height()); if (effect->hasWidth()) - newSubRegion.setWidth(subRegionBBox.width() * m_itemBox.width()); + newSubRegion.setWidth(subRegionBBox.width() * m_targetBoundingBox.width()); if (effect->hasHeight()) - newSubRegion.setHeight(subRegionBBox.height() * m_itemBox.height()); + newSubRegion.setHeight(subRegionBBox.height() * m_targetBoundingBox.height()); } else { if (!effect->hasX()) - newSubRegion.setX(useBBox.x()); + newSubRegion.setX(unionOfPreviousPrimitiveSubregions.x()); if (!effect->hasY()) - newSubRegion.setY(useBBox.y()); + newSubRegion.setY(unionOfPreviousPrimitiveSubregions.y()); if (!effect->hasWidth()) - newSubRegion.setWidth(useBBox.width()); + newSubRegion.setWidth(unionOfPreviousPrimitiveSubregions.width()); if (!effect->hasHeight()) - newSubRegion.setHeight(useBBox.height()); + newSubRegion.setHeight(unionOfPreviousPrimitiveSubregions.height()); } // clip every filter effect to the filter region newSubRegion.intersect(m_filterRect); - effect->setSubRegion(newSubRegion); + 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.scale(filterResolution().width(), filterResolution().height()); - effect->setScaledSubRegion(newSubRegion); + effect->setRepaintRectInLocalCoordinates(newSubRegion); m_maxImageSize = m_maxImageSize.expandedTo(newSubRegion.size()); } -PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode) +PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& targetBoundingBox, const FloatRect& filterRect, bool effectBBoxMode) { - return adoptRef(new SVGFilter(itemBox, filterRect, effectBBoxMode)); + return adoptRef(new SVGFilter(targetBoundingBox, filterRect, effectBBoxMode)); } } // namespace WebCore diff --git a/WebCore/svg/graphics/filters/SVGFilter.h b/WebCore/svg/graphics/filters/SVGFilter.h index 1ee5e8a..631f1ee 100644 --- a/WebCore/svg/graphics/filters/SVGFilter.h +++ b/WebCore/svg/graphics/filters/SVGFilter.h @@ -39,16 +39,17 @@ namespace WebCore { virtual bool effectBoundingBoxMode() const { return m_effectBBoxMode; } virtual FloatRect filterRegion() const { return m_filterRect; } - virtual FloatRect sourceImageRect() const { return m_itemBox; } + + virtual FloatRect sourceImageRect() const { return m_targetBoundingBox; } virtual FloatSize maxImageSize() const { return m_maxImageSize; } - virtual void calculateEffectSubRegion(FilterEffect*); + virtual void determineFilterPrimitiveSubregion(FilterEffect*, const FloatRect&); private: - SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode); + SVGFilter(const FloatRect& targetBoundingBox, const FloatRect& filterRect, bool effectBBoxMode); FloatSize m_maxImageSize; - FloatRect m_itemBox; + FloatRect m_targetBoundingBox; FloatRect m_filterRect; bool m_effectBBoxMode; }; |