Changeset 44655 in webkit


Ignore:
Timestamp:
Jun 13, 2009 12:54:11 PM (15 years ago)
Author:
krit@webkit.org
Message:

2009-06-13 Dirk Schulze <krit@webkit.org>

Reviewed by Eric Seidel.

Added subRegion calculation to SVG filter. Every filter effect is
clipped to the filter region (according to the spec). This makes
ImageBuffers for filter effects smaller and we just need to take
care about big filter regions.
SVGFEImage needed a correction, to avoid an ASSERT. The two filter
effects feOffset and feFlood help to test the new subRegion code.

Tests: svg/filters/subRegion-one-effect.svg

svg/filters/subRegion-two-effects.svg

Added tests for the new subRgion-code on SVG filters.

  • platform/mac/svg/filters: Added.
  • platform/mac/svg/filters/subRegion-one-effect-expected.checksum: Added.
  • platform/mac/svg/filters/subRegion-one-effect-expected.png: Added.
  • platform/mac/svg/filters/subRegion-one-effect-expected.txt: Added.
  • platform/mac/svg/filters/subRegion-two-effects-expected.checksum: Added.
  • platform/mac/svg/filters/subRegion-two-effects-expected.png: Added.
  • platform/mac/svg/filters/subRegion-two-effects-expected.txt: Added.
  • svg/filters: Added.
  • svg/filters/subRegion-one-effect.svg: Added.
  • svg/filters/subRegion-two-effects.svg: Added.
Location:
trunk
Files:
10 added
33 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r44647 r44655  
     12009-06-13  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Added tests for the new subRgion-code on SVG filters.
     6
     7        * platform/mac/svg/filters: Added.
     8        * platform/mac/svg/filters/subRegion-one-effect-expected.checksum: Added.
     9        * platform/mac/svg/filters/subRegion-one-effect-expected.png: Added.
     10        * platform/mac/svg/filters/subRegion-one-effect-expected.txt: Added.
     11        * platform/mac/svg/filters/subRegion-two-effects-expected.checksum: Added.
     12        * platform/mac/svg/filters/subRegion-two-effects-expected.png: Added.
     13        * platform/mac/svg/filters/subRegion-two-effects-expected.txt: Added.
     14        * svg/filters: Added.
     15        * svg/filters/subRegion-one-effect.svg: Added.
     16        * svg/filters/subRegion-two-effects.svg: Added.
     17
    1182009-06-12  Jan Michael Alonzo  <jmalonzo@webkit.org>
    219
  • trunk/WebCore/ChangeLog

    r44654 r44655  
     12009-06-13  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Added subRegion calculation to SVG filter. Every filter effect is
     6        clipped to the filter region (according to the spec). This makes
     7        ImageBuffers for filter effects smaller and we just need to take
     8        care about big filter regions.
     9        SVGFEImage needed a correction, to avoid an ASSERT. The two filter
     10        effects feOffset and feFlood help to test the new subRegion code.
     11
     12        Tests: svg/filters/subRegion-one-effect.svg
     13               svg/filters/subRegion-two-effects.svg
     14
     15        * platform/graphics/filters/FEBlend.h:
     16        (WebCore::FEBlend::uniteChildEffectSubregions):
     17        * platform/graphics/filters/FEColorMatrix.h:
     18        (WebCore::FEColorMatrix::uniteChildEffectSubregions):
     19        * platform/graphics/filters/FEComponentTransfer.h:
     20        (WebCore::FEComponentTransfer::uniteChildEffectSubregions):
     21        * platform/graphics/filters/FEComposite.h:
     22        (WebCore::FEComposite::uniteChildEffectSubregions):
     23        * platform/graphics/filters/Filter.h:
     24        (WebCore::Filter::setSourceImage):
     25        (WebCore::Filter::sourceImage):
     26        * platform/graphics/filters/FilterEffect.cpp:
     27        (WebCore::FilterEffect::FilterEffect):
     28        (WebCore::FilterEffect::calculateUnionOfChildEffectSubregions):
     29        (WebCore::FilterEffect::calculateEffectRect):
     30        * platform/graphics/filters/FilterEffect.h:
     31        (WebCore::FilterEffect::setUnionOfChildEffectSubregions):
     32        (WebCore::FilterEffect::unionOfChildEffectSubregions):
     33        (WebCore::FilterEffect::hasX):
     34        (WebCore::FilterEffect::setHasX):
     35        (WebCore::FilterEffect::hasY):
     36        (WebCore::FilterEffect::setHasY):
     37        (WebCore::FilterEffect::hasWidth):
     38        (WebCore::FilterEffect::setHasWidth):
     39        (WebCore::FilterEffect::hasHeight):
     40        (WebCore::FilterEffect::setHasHeight):
     41        (WebCore::FilterEffect::setEffectBuffer):
     42        (WebCore::FilterEffect::uniteChildEffectSubregions):
     43        * platform/graphics/filters/SourceAlpha.h:
     44        (WebCore::SourceAlpha::calculateEffectRect):
     45        * platform/graphics/filters/SourceGraphic.cpp:
     46        (WebCore::SourceGraphic::calculateEffectRect):
     47        (WebCore::SourceGraphic::apply):
     48        * platform/graphics/filters/SourceGraphic.h:
     49        * rendering/SVGRenderSupport.cpp:
     50        (WebCore::SVGRenderBase::prepareToRenderSVGContent):
     51        (WebCore::SVGRenderBase::finishRenderSVGContent):
     52        * svg/SVGFilterPrimitiveStandardAttributes.cpp:
     53        (WebCore::SVGFilterPrimitiveStandardAttributes::setStandardAttributes):
     54        * svg/graphics/SVGResourceFilter.cpp:
     55        (WebCore::SVGResourceFilter::prepareFilter):
     56        (WebCore::SVGResourceFilter::applyFilter):
     57        * svg/graphics/SVGResourceFilter.h:
     58        * svg/graphics/filters/SVGFEConvolveMatrix.h:
     59        (WebCore::FEConvolveMatrix::uniteChildEffectSubregions):
     60        * svg/graphics/filters/SVGFEDiffuseLighting.h:
     61        (WebCore::FEDiffuseLighting::uniteChildEffectSubregions):
     62        * svg/graphics/filters/SVGFEDisplacementMap.h:
     63        (WebCore::FEDisplacementMap::uniteChildEffectSubregions):
     64        * svg/graphics/filters/SVGFEFlood.cpp:
     65        (WebCore::FEFlood::apply):
     66        * svg/graphics/filters/SVGFEGaussianBlur.h:
     67        (WebCore::FEGaussianBlur::uniteChildEffectSubregions):
     68        * svg/graphics/filters/SVGFEImage.cpp:
     69        (WebCore::FEImage::FEImage):
     70        * svg/graphics/filters/SVGFEImage.h:
     71        * svg/graphics/filters/SVGFEMerge.cpp:
     72        (WebCore::FEMerge::uniteEffectRect):
     73        * svg/graphics/filters/SVGFEMerge.h:
     74        * svg/graphics/filters/SVGFEMorphology.h:
     75        (WebCore::FEMorphology::uniteChildEffectSubregions):
     76        * svg/graphics/filters/SVGFEOffset.cpp:
     77        (WebCore::FEOffset::apply):
     78        * svg/graphics/filters/SVGFEOffset.h:
     79        (WebCore::FEOffset::uniteChildEffectSubregions):
     80        * svg/graphics/filters/SVGFESpecularLighting.h:
     81        (WebCore::FESpecularLighting::uniteEffectRect):
     82        * svg/graphics/filters/SVGFETile.cpp:
     83        (WebCore::FETile::uniteChildEffectSubregions):
     84        * svg/graphics/filters/SVGFETile.h:
     85        * svg/graphics/filters/SVGFilter.cpp:
     86        (WebCore::SVGFilter::calculateEffectSubRegion):
     87        * svg/graphics/filters/SVGFilter.h:
     88        (WebCore::SVGFilter::effectBoundingBoxMode):
     89        (WebCore::SVGFilter::filterRegion):
     90        (WebCore::SVGFilter::sourceImageRect):
     91
    1922009-06-13  Peter Kasting  <pkasting@google.com>
    293
  • trunk/WebCore/platform/graphics/filters/FEBlend.h

    r44296 r44655  
    4848        BlendModeType blendMode() const;
    4949        void setBlendMode(BlendModeType);
    50        
     50
     51        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get(), m_in2.get()); }
    5152        void apply(Filter*);
    5253        void dump();
  • trunk/WebCore/platform/graphics/filters/FEColorMatrix.h

    r44296 r44655  
    4848        const Vector<float>& values() const;
    4949        void setValues(const Vector<float>&);
    50        
     50
     51        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    5152        void apply(Filter*);
    5253        void dump();
  • trunk/WebCore/platform/graphics/filters/FEComponentTransfer.h

    r44296 r44655  
    7979        ComponentTransferFunction alphaFunction() const;
    8080        void setAlphaFunction(const ComponentTransferFunction&);
    81        
     81
     82        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    8283        void apply(Filter*);
    8384        void dump();
  • trunk/WebCore/platform/graphics/filters/FEComposite.h

    r44296 r44655  
    6060        float k4() const;
    6161        void setK4(float);
    62        
     62
     63        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get(), m_in2.get()); }
    6364        void apply(Filter*);
    6465        void dump();
  • trunk/WebCore/platform/graphics/filters/Filter.h

    r44299 r44655  
    2222
    2323#if ENABLE(FILTERS)
    24 #include "Image.h"
     24#include "FloatRect.h"
     25#include "ImageBuffer.h"
    2526#include "StringHash.h"
    2627
     
    3738        virtual ~Filter() { }
    3839
    39         void setSourceImage(PassRefPtr<Image> image) { m_image = image; }
    40         Image* sourceImage() { return m_image.get(); }
     40        void setSourceImage(PassOwnPtr<ImageBuffer> sourceImage) { m_sourceImage = sourceImage; }
     41        ImageBuffer* sourceImage() { return m_sourceImage.get(); }
    4142
     43        virtual FloatRect sourceImageRect() = 0;
     44        virtual FloatRect filterRegion() = 0;
     45
     46        // SVG specific
    4247        virtual void calculateEffectSubRegion(FilterEffect*) = 0;
     48        virtual bool effectBoundingBoxMode() = 0;
    4349
    4450    private:
    45         RefPtr<Image> m_image;
     51        OwnPtr<ImageBuffer> m_sourceImage;
    4652    };
    4753
  • trunk/WebCore/platform/graphics/filters/FilterEffect.cpp

    r44253 r44655  
    3030    , m_widthBBoxMode(false)
    3131    , m_heightBBoxMode(false)
     32    , m_hasX(false)
     33    , m_hasY(false)
     34    , m_hasWidth(false)
     35    , m_hasHeight(false)
    3236{
    3337}
     
    3539FilterEffect::~FilterEffect()
    3640{
     41}
     42
     43FloatRect FilterEffect::calculateUnionOfChildEffectSubregions(Filter* filter, FilterEffect* in)
     44{
     45    return in->calculateEffectRect(filter);
     46}
     47
     48FloatRect FilterEffect::calculateUnionOfChildEffectSubregions(Filter* filter, FilterEffect* in, FilterEffect* in2)
     49{
     50    FloatRect uniteEffectRect = in->calculateEffectRect(filter);
     51    uniteEffectRect.unite(in2->calculateEffectRect(filter));
     52    return uniteEffectRect;
     53}
     54
     55FloatRect FilterEffect::calculateEffectRect(Filter* filter)
     56{
     57    setUnionOfChildEffectSubregions(uniteChildEffectSubregions(filter));
     58    filter->calculateEffectSubRegion(this);
     59    return subRegion();
    3760}
    3861
  • trunk/WebCore/platform/graphics/filters/FilterEffect.h

    r44296 r44655  
    2828#include "TextStream.h"
    2929
     30#include <wtf/PassOwnPtr.h>
    3031#include <wtf/RefCounted.h>
    3132#include <wtf/RefPtr.h>
     
    4950        void setHeightBoundingBoxMode(bool bboxMode) { m_heightBBoxMode = bboxMode; }
    5051
     52        void setUnionOfChildEffectSubregions(const FloatRect& uniteRect) { m_unionOfChildEffectSubregions = uniteRect; }
     53        FloatRect unionOfChildEffectSubregions() const { return m_unionOfChildEffectSubregions; }
     54
    5155        FloatRect subRegion() const { return m_subRegion; }
    5256        void setSubRegion(const FloatRect& subRegion) { m_subRegion = subRegion; }
    5357
     58        bool hasX() { return m_hasX; }
     59        void setHasX(bool value) { m_hasX = value; }
     60
     61        bool hasY() { return m_hasY; }
     62        void setHasY(bool value) { m_hasY = value; }
     63
     64        bool hasWidth() { return m_hasWidth; }
     65        void setHasWidth(bool value) { m_hasWidth = value; }
     66
     67        bool hasHeight() { return m_hasHeight; }
     68        void setHasHeight(bool value) { m_hasHeight = value; }
     69
    5470        // The result is bounded by the size of the filter primitive to save resources
    5571        ImageBuffer* resultImage() { return m_effectBuffer.get(); }
    56         void setEffectBuffer(ImageBuffer* effectBuffer) { m_effectBuffer.set(effectBuffer); }
     72        void setEffectBuffer(PassOwnPtr<ImageBuffer> effectBuffer) { m_effectBuffer = effectBuffer; }
    5773
     74        FloatRect calculateUnionOfChildEffectSubregions(Filter*, FilterEffect*, FilterEffect*);
     75        FloatRect calculateUnionOfChildEffectSubregions(Filter*, FilterEffect*);
     76
     77        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return filter->filterRegion(); }
     78        virtual FloatRect calculateEffectRect(Filter*);
    5879        virtual void apply(Filter*) = 0;
    5980        virtual void dump() = 0;
     
    7091        bool m_heightBBoxMode : 1;
    7192
     93        bool m_hasX : 1;
     94        bool m_hasY : 1;
     95        bool m_hasWidth : 1;
     96        bool m_hasHeight : 1;
     97
    7298        FloatRect m_subRegion;
     99        FloatRect m_unionOfChildEffectSubregions;
    73100
    74101        mutable OwnPtr<ImageBuffer> m_effectBuffer;
  • trunk/WebCore/platform/graphics/filters/SourceAlpha.h

    r44296 r44655  
    3535        static const AtomicString& effectName();
    3636
     37        virtual FloatRect calculateEffectRect(Filter* filter) { return filter->sourceImageRect(); }
    3738        void apply(Filter*);
    3839        void dump();
  • trunk/WebCore/platform/graphics/filters/SourceGraphic.cpp

    r44296 r44655  
    4242}
    4343
    44 void SourceGraphic::apply(Filter*)
     44FloatRect SourceGraphic::calculateEffectRect(Filter* filter)
    4545{
     46    FloatRect clippedSourceRect = filter->sourceImageRect();
     47    if (filter->sourceImageRect().x() < filter->filterRegion().x())
     48        clippedSourceRect.setX(filter->filterRegion().x());
     49    if (filter->sourceImageRect().y() < filter->filterRegion().y())
     50        clippedSourceRect.setY(filter->filterRegion().y());
     51    setSubRegion(clippedSourceRect);
     52    return filter->filterRegion();
     53}
     54
     55void SourceGraphic::apply(Filter* filter)
     56{
     57    IntRect bufferRect = enclosingIntRect(subRegion());
     58    OwnPtr<ImageBuffer> filterGraphic(ImageBuffer::create(bufferRect.size(), false));
     59
     60    if (!filterGraphic.get())
     61        return;
     62
     63    GraphicsContext* filterContext = filterGraphic->context();
     64    filterContext->drawImage(filter->sourceImage()->image(), IntPoint());
     65
     66    setEffectBuffer(filterGraphic.release());
    4667}
    4768
  • trunk/WebCore/platform/graphics/filters/SourceGraphic.h

    r44296 r44655  
    2525#include "FilterEffect.h"
    2626
     27#include "Filter.h"
    2728#include "PlatformString.h"
    28 #include "Filter.h"
    2929
    3030namespace WebCore {
     
    3636        static const AtomicString& effectName();
    3737
     38        virtual FloatRect calculateEffectRect(Filter*);
    3839        void apply(Filter*);
    3940        void dump();
  • trunk/WebCore/rendering/SVGRenderSupport.cpp

    r44337 r44655  
    121121    if (filter) {
    122122        filter->addClient(styledElement);
    123         filter->prepareFilter(paintInfo.context, object->objectBoundingBox());
     123        filter->prepareFilter(paintInfo.context, object);
    124124    } else if (!filterId.isEmpty())
    125125        svgElement->document()->accessSVGExtensions()->addPendingResource(filterId, styledElement);
     
    153153#if ENABLE(FILTERS)
    154154    if (filter) {
    155         filter->applyFilter(paintInfo.context, object->objectBoundingBox());
     155        filter->applyFilter(paintInfo.context, object);
    156156        paintInfo.context = savedContext;
    157157    }
  • trunk/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp

    r44299 r44655  
    8080    float _x, _y, _width, _height;
    8181
     82    if (this->hasAttribute(SVGNames::xAttr))
     83        filterEffect->setHasX(true);
     84    if (this->hasAttribute(SVGNames::yAttr))
     85        filterEffect->setHasY(true);
     86    if (this->hasAttribute(SVGNames::widthAttr))
     87        filterEffect->setHasWidth(true);
     88    if (this->hasAttribute(SVGNames::heightAttr))
     89        filterEffect->setHasHeight(true);
     90
    8291    if (resourceFilter->effectBoundingBoxMode()) {
    8392        _x = x().valueAsPercentage();
  • trunk/WebCore/svg/graphics/SVGResourceFilter.cpp

    r44309 r44655  
    6767}
    6868
    69 void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const FloatRect& itemRect)
     69void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const RenderObject* object)
    7070{
     71    m_itemBBox = object->objectBoundingBox();
     72    m_filterBBox = filterBBoxForItemBBox(m_itemBBox);
     73
     74    // clip sourceImage to filterRegion
     75    FloatRect clippedSourceRect = m_itemBBox;
     76    clippedSourceRect.intersect(m_filterBBox);
     77
     78    // prepare Filters
     79    m_filter = SVGFilter::create(m_itemBBox, m_filterBBox, m_effectBBoxMode, m_filterBBoxMode);
     80
     81    FilterEffect* lastEffect = m_filterBuilder->lastEffect();
     82    if (lastEffect)
     83        lastEffect->calculateEffectRect(m_filter.get());
     84
    7185    // Draw the content of the current element and it's childs to a imageBuffer to get the SourceGraphic.
    72     // The size of the SourceGraphic must match the size of the element, the filter is aplied to.
    73     IntSize bufferSize = IntSize(itemRect.width(), itemRect.height());
    74     OwnPtr<ImageBuffer> sourceGraphic(ImageBuffer::create(bufferSize, false));
     86    // The size of the SourceGraphic is clipped to the size of the filterRegion.
     87    IntRect bufferRect = enclosingIntRect(clippedSourceRect);
     88    OwnPtr<ImageBuffer> sourceGraphic(ImageBuffer::create(bufferRect.size(), false));
    7589   
    7690    if (!sourceGraphic.get())
     
    7892
    7993    GraphicsContext* sourceGraphicContext = sourceGraphic->context();
    80     sourceGraphicContext->translate(-itemRect.x(), -itemRect.y());
    81     sourceGraphicContext->clearRect(FloatRect(0, 0, itemRect.width(), itemRect.height()));
     94    sourceGraphicContext->translate(-m_itemBBox.x(), -m_itemBBox.y());
     95    sourceGraphicContext->clearRect(FloatRect(FloatPoint(), m_itemBBox.size()));
    8296    m_sourceGraphicBuffer.set(sourceGraphic.release());
    8397    m_savedContext = context;
     
    86100}
    87101
    88 void SVGResourceFilter::applyFilter(GraphicsContext*& context, const FloatRect& itemRect)
     102void SVGResourceFilter::applyFilter(GraphicsContext*& context, const RenderObject*)
    89103{
    90104    if (!m_savedContext)
    91105        return;
    92 
    93     FloatRect filterRect = filterBBoxForItemBBox(itemRect);
    94 
    95     setFilterBoundingBox(filterRect);
    96     setItemBoundingBox(itemRect);
    97106
    98107    context = m_savedContext;
     
    101110    FilterEffect* lastEffect = m_filterBuilder->lastEffect();
    102111
    103     if (lastEffect && !filterRect.isEmpty()) {
    104         RefPtr<Filter> filter = SVGFilter::create(m_itemBBox, m_filterBBox, m_effectBBoxMode, m_filterBBoxMode);
    105         filter->setSourceImage(m_sourceGraphicBuffer->image());
    106         lastEffect->apply(filter.get());
    107 
    108         context->clip(filterRect);
     112    if (lastEffect && !m_filterBBox.isEmpty() && !lastEffect->subRegion().isEmpty()) {
     113        m_filter->setSourceImage(m_sourceGraphicBuffer.release());
     114        lastEffect->apply(m_filter.get());
    109115
    110116        if (lastEffect->resultImage())
    111             context->drawImage(lastEffect->resultImage()->image(),
    112                             lastEffect->subRegion());
     117            context->drawImage(lastEffect->resultImage()->image(), lastEffect->subRegion());
    113118    }
    114119
  • trunk/WebCore/svg/graphics/SVGResourceFilter.h

    r44309 r44655  
    3030#include "ImageBuffer.h"
    3131#include "FloatRect.h"
     32#include "RenderObject.h"
    3233#include "SVGFilterPrimitiveStandardAttributes.h"
    3334
     
    3536#include <wtf/PassOwnPtr.h>
    3637#include <wtf/PassRefPtr.h>
     38#include <wtf/RefPtr.h>
    3739
    3840namespace WebCore {
     
    7577    virtual TextStream& externalRepresentation(TextStream&) const;
    7678
    77     void prepareFilter(GraphicsContext*&, const FloatRect&);
    78     void applyFilter(GraphicsContext*&, const FloatRect&);
     79    void prepareFilter(GraphicsContext*&, const RenderObject*);
     80    void applyFilter(GraphicsContext*&, const RenderObject*);
    7981
    8082    void addFilterEffect(SVGFilterPrimitiveStandardAttributes*, PassRefPtr<FilterEffect>);
     
    98100    GraphicsContext* m_savedContext;
    99101    OwnPtr<ImageBuffer> m_sourceGraphicBuffer;
     102    RefPtr<Filter> m_filter;
    100103};
    101104
  • trunk/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h

    r44296 r44655  
    6969        void setPreserveAlpha(bool);
    7070
     71        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get(), m_in2.get()); }
    7172        void apply(Filter*);
    7273        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h

    r44296 r44655  
    5656        void setLightSource(LightSource*);
    5757
     58        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    5859        void apply(Filter*);
    5960        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h

    r44296 r44655  
    5252        void setScale(float scale);
    5353
     54        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get(), m_in2.get()); }
    5455        void apply(Filter*);
    5556        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEFlood.cpp

    r44337 r44655  
    33                  2004, 2005 Rob Buis <buis@kde.org>
    44                  2005 Eric Seidel <eric@webkit.org>
     5                  2009 Dirk Schulze <krit@webkit.org>
    56
    67    This library is free software; you can redistribute it and/or
     
    2425#if ENABLE(SVG) && ENABLE(FILTERS)
    2526#include "SVGFEFlood.h"
     27
    2628#include "Filter.h"
     29#include "GraphicsContext.h"
    2730#include "SVGRenderTreeAsText.h"
    2831
     
    6467void FEFlood::apply(Filter*)
    6568{
     69    IntRect bufferRect = enclosingIntRect(subRegion());
     70    OwnPtr<ImageBuffer> filterGraphic(ImageBuffer::create(bufferRect.size(), false));
     71
     72    if (!filterGraphic)
     73        return;
     74
     75    Color color = colorWithOverrideAlpha(floodColor().rgb(), floodOpacity());
     76    GraphicsContext* filterContext = filterGraphic->context();
     77    filterContext->fillRect(FloatRect(FloatPoint(), subRegion().size()), color);
     78
     79    setEffectBuffer(filterGraphic.release());
    6680}
    6781
  • trunk/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h

    r44296 r44655  
    3939        void setStdDeviationY(float);
    4040
     41        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    4142        void apply(Filter*);
    4243        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEImage.cpp

    r44296 r44655  
    3333    , m_cachedImage(cachedImage)
    3434{
     35    m_cachedImage->addClient(this);
    3536}
    3637
  • trunk/WebCore/svg/graphics/filters/SVGFEImage.h

    r44296 r44655  
    4242        CachedImage* cachedImage() const;
    4343        void setCachedImage(CachedImage*);
    44        
     44
    4545        void apply(Filter*);
    4646        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEMerge.cpp

    r44296 r44655  
    5050}
    5151
     52FloatRect FEMerge::uniteEffectRect(Filter* filter)
     53{
     54    if (m_mergeInputs.isEmpty())
     55        return FloatRect();
     56
     57    FloatRect uniteEffectRect = m_mergeInputs[0]->calculateEffectRect(filter);
     58
     59    for (unsigned i = 1; i < m_mergeInputs.size(); i++)
     60        uniteEffectRect.unite(m_mergeInputs[i]->calculateEffectRect(filter));
     61
     62    return uniteEffectRect;
     63}
     64
    5265void FEMerge::apply(Filter*)
    5366{
  • trunk/WebCore/svg/graphics/filters/SVGFEMerge.h

    r44296 r44655  
    3636        const Vector<FilterEffect*>& mergeInputs() const;
    3737        void setMergeInputs(const Vector<FilterEffect*>& mergeInputs);
    38        
     38
     39        virtual FloatRect uniteEffectRect(Filter*);
    3940        void apply(Filter*);
    4041        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEMorphology.h

    r44296 r44655  
    4747        void setRadiusY(float);
    4848
     49        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    4950        void apply(Filter*);
    5051        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFEOffset.cpp

    r44296 r44655  
    33                  2004, 2005 Rob Buis <buis@kde.org>
    44                  2005 Eric Seidel <eric@webkit.org>
     5                  2009 Dirk Schulze <krit@webkit.org>
    56
    67    This library is free software; you can redistribute it and/or
     
    2425#if ENABLE(SVG) && ENABLE(FILTERS)
    2526#include "SVGFEOffset.h"
     27
     28#include "Filter.h"
     29#include "GraphicsContext.h"
    2630#include "SVGRenderTreeAsText.h"
    27 #include "Filter.h"
    2831
    2932namespace WebCore {
     
    6265}
    6366
    64 void FEOffset::apply(Filter*)
     67void FEOffset::apply(Filter* filter)
    6568{
     69    m_in->apply(filter);
     70    if (!m_in->resultImage())
     71        return;
     72
     73    IntRect bufferRect = enclosingIntRect(subRegion());
     74    OwnPtr<ImageBuffer> filterGraphic(ImageBuffer::create(bufferRect.size(), false));
     75
     76    if (!filterGraphic)
     77        return;
     78
     79    FloatRect dstRect = FloatRect(dx() + m_in->subRegion().x() - subRegion().x(),
     80                                  dy() + m_in->subRegion().y() - subRegion().y(),
     81                                  m_in->subRegion().width(),
     82                                  m_in->subRegion().height());
     83
     84    GraphicsContext* filterContext = filterGraphic->context();
     85    filterContext->drawImage(m_in->resultImage()->image(), dstRect);
     86    setEffectBuffer(filterGraphic.release());
    6687}
    6788
  • trunk/WebCore/svg/graphics/filters/SVGFEOffset.h

    r44296 r44655  
    3939        void setDy(float);
    4040
     41        virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    4142        void apply(Filter*);
    4243        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFESpecularLighting.h

    r44296 r44655  
    5858        void setLightSource(LightSource*);
    5959
     60        virtual FloatRect uniteEffectRect(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
    6061        void apply(Filter*);
    6162        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFETile.cpp

    r44296 r44655  
    2222#if ENABLE(SVG) && ENABLE(FILTERS)
    2323#include "SVGFETile.h"
     24
     25#include "Filter.h"
    2426#include "SVGRenderTreeAsText.h"
    25 #include "Filter.h"
    2627
    2728namespace WebCore {
     
    3637{
    3738    return adoptRef(new FETile(in));
     39}
     40
     41FloatRect FETile::uniteChildEffectSubregions(Filter* filter)
     42{
     43    m_in->calculateEffectRect(filter);
     44    return filter->filterRegion();
    3845}
    3946
  • trunk/WebCore/svg/graphics/filters/SVGFETile.h

    r44296 r44655  
    3333        static PassRefPtr<FETile> create(FilterEffect*);
    3434
     35        virtual FloatRect uniteChildEffectSubregions(Filter*);
    3536        void apply(Filter*);
    3637        void dump();
  • trunk/WebCore/svg/graphics/filters/SVGFilter.cpp

    r44296 r44655  
    3434}
    3535
    36 void SVGFilter::calculateEffectSubRegion(FilterEffect*)
     36void SVGFilter::calculateEffectSubRegion(FilterEffect* effect)
    3737{
     38    FloatRect subRegionBBox = effect->subRegion();
     39    FloatRect useBBox = effect->unionOfChildEffectSubregions();
     40
     41    FloatRect newSubRegion = subRegionBBox;
     42
     43    if (m_effectBBoxMode) {
     44        newSubRegion = useBBox;
     45
     46        if (effect->hasX())
     47            newSubRegion.setX(m_itemBox.x() + subRegionBBox.x() * m_itemBox.width());
     48
     49        if (effect->hasY())
     50            newSubRegion.setY(m_itemBox.y() + subRegionBBox.y() * m_itemBox.height());
     51
     52        if (effect->hasWidth())
     53            newSubRegion.setWidth(subRegionBBox.width() * m_itemBox.width());
     54
     55        if (effect->hasHeight())
     56            newSubRegion.setHeight(subRegionBBox.height() * m_itemBox.height());
     57    } else {
     58        if (effect->xBoundingBoxMode())
     59            newSubRegion.setX(useBBox.x() + subRegionBBox.x() * useBBox.width());
     60
     61        if (effect->yBoundingBoxMode())
     62            newSubRegion.setY(useBBox.y() + subRegionBBox.y() * useBBox.height());
     63
     64        if (effect->widthBoundingBoxMode())
     65            newSubRegion.setWidth(subRegionBBox.width() * useBBox.width());
     66
     67        if (effect->heightBoundingBoxMode())
     68            newSubRegion.setHeight(subRegionBBox.height() * useBBox.height());
     69    }
     70
     71    // clip every filter effect to the filter region
     72    newSubRegion.intersect(m_filterRect);
     73
     74    effect->setSubRegion(newSubRegion);
    3875}
    3976
  • trunk/WebCore/svg/graphics/filters/SVGFilter.h

    r44296 r44655  
    3636        static PassRefPtr<SVGFilter> create(const FloatRect&, const FloatRect&, bool, bool);
    3737
     38        bool effectBoundingBoxMode() { return m_effectBBoxMode; }
     39
     40        FloatRect filterRegion() { return m_filterRect; }
     41        FloatRect sourceImageRect() { return m_itemBox; }
    3842        void calculateEffectSubRegion(FilterEffect*);
    3943
Note: See TracChangeset for help on using the changeset viewer.