/*
    Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
                  2004, 2005 Rob Buis <buis@kde.org>
                  2005 Eric Seidel <eric@webkit.org>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    aint with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#ifndef SVGFEDisplacementMap_h
#define SVGFEDisplacementMap_h

#if ENABLE(SVG) && ENABLE(FILTERS)
#include "PlatformString.h"
#include "FilterEffect.h"
#include "Filter.h"

namespace WebCore {

    enum ChannelSelectorType {
        CHANNEL_UNKNOWN = 0,
        CHANNEL_R       = 1,
        CHANNEL_G       = 2,
        CHANNEL_B       = 3,
        CHANNEL_A       = 4
    };
    
    class FEDisplacementMap : public FilterEffect {
    public:
        static PassRefPtr<FEDisplacementMap> create(FilterEffect*, FilterEffect*, ChannelSelectorType,
                ChannelSelectorType, const float&);

        ChannelSelectorType xChannelSelector() const;
        void setXChannelSelector(const ChannelSelectorType);

        ChannelSelectorType yChannelSelector() const;
        void setYChannelSelector(const ChannelSelectorType);

        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;

    private:
        FEDisplacementMap(FilterEffect*, FilterEffect*, ChannelSelectorType,
            ChannelSelectorType, const float&);

        RefPtr<FilterEffect> m_in;
        RefPtr<FilterEffect> m_in2;
        ChannelSelectorType m_xChannelSelector;
        ChannelSelectorType m_yChannelSelector;
        float m_scale;
    };

} // namespace WebCore

#endif // ENABLE(SVG) && ENABLE(FILTERS)

#endif // SVGFEDisplacementMap_h
