#ifndef FilterEffect_h
#define FilterEffect_h
#if ENABLE(FILTERS)
#include "FloatRect.h"
#include "IntRect.h"
#include <wtf/ByteArray.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
static const float kMaxFilterSize = 5000.0f;
namespace WebCore {
class Filter;
class FilterEffect;
class ImageBuffer;
class TextStream;
typedef Vector<RefPtr<FilterEffect> > FilterEffectVector;
enum FilterEffectType {
FilterEffectTypeUnknown,
FilterEffectTypeImage,
FilterEffectTypeTile,
FilterEffectTypeSourceInput
};
class FilterEffect : public RefCounted<FilterEffect> {
public:
virtual ~FilterEffect();
bool hasResult() const { return m_imageBufferResult || m_unmultipliedImageResult || m_premultipliedImageResult; }
void clearResult();
ImageBuffer* asImageBuffer();
PassRefPtr<ByteArray> asUnmultipliedImage(const IntRect&);
PassRefPtr<ByteArray> asPremultipliedImage(const IntRect&);
void copyUnmultipliedImage(ByteArray* destination, const IntRect&);
void copyPremultipliedImage(ByteArray* destination, const IntRect&);
FilterEffectVector& inputEffects() { return m_inputEffects; }
FilterEffect* inputEffect(unsigned) const;
unsigned numberOfEffectInputs() const { return m_inputEffects.size(); }
IntRect drawingRegionOfInputImage(const IntRect&) const;
IntRect requestedRegionOfInputImageData(const IntRect&) const;
bool isAlphaImage() const { return m_alphaImage; }
void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; }
IntRect absolutePaintRect() const { return m_absolutePaintRect; }
void setAbsolutePaintRect(const IntRect& absolutePaintRect) { m_absolutePaintRect = absolutePaintRect; }
FloatRect maxEffectRect() const { return m_maxEffectRect; }
void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = maxEffectRect; }
virtual void apply() = 0;
virtual void dump() = 0;
virtual void determineAbsolutePaintRect();
virtual FilterEffectType filterEffectType() const { return FilterEffectTypeUnknown; }
virtual TextStream& externalRepresentation(TextStream&, int indention = 0) const;
public:
bool hasX() const { return m_hasX; }
void setHasX(bool value) { m_hasX = value; }
bool hasY() const { return m_hasY; }
void setHasY(bool value) { m_hasY = value; }
bool hasWidth() const { return m_hasWidth; }
void setHasWidth(bool value) { m_hasWidth = value; }
bool hasHeight() const { return m_hasHeight; }
void setHasHeight(bool value) { m_hasHeight = value; }
FloatRect filterPrimitiveSubregion() const { return m_filterPrimitiveSubregion; }
void setFilterPrimitiveSubregion(const FloatRect& filterPrimitiveSubregion) { m_filterPrimitiveSubregion = filterPrimitiveSubregion; }
FloatRect effectBoundaries() const { return m_effectBoundaries; }
void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBoundaries = effectBoundaries; }
Filter* filter() { return m_filter; }
protected:
FilterEffect(Filter*);
ImageBuffer* createImageBufferResult();
ByteArray* createUnmultipliedImageResult();
ByteArray* createPremultipliedImageResult();
private:
OwnPtr<ImageBuffer> m_imageBufferResult;
RefPtr<ByteArray> m_unmultipliedImageResult;
RefPtr<ByteArray> m_premultipliedImageResult;
FilterEffectVector m_inputEffects;
bool m_alphaImage;
IntRect m_absolutePaintRect;
FloatRect m_maxEffectRect;
Filter* m_filter;
private:
inline void copyImageBytes(ByteArray* source, ByteArray* destination, const IntRect&);
FloatRect m_filterPrimitiveSubregion;
FloatRect m_effectBoundaries;
bool m_hasX;
bool m_hasY;
bool m_hasWidth;
bool m_hasHeight;
};
}
#endif // ENABLE(FILTERS)
#endif // FilterEffect_h