#pragma once
#include "AffineTransform.h"
#include "FloatRect.h"
#include "GraphicsTypes.h"
#include "ImageBuffer.h"
#include <wtf/RefCounted.h>
namespace WebCore {
class FilterEffect;
class Filter : public RefCounted<Filter> {
public:
Filter(const AffineTransform& absoluteTransform, float filterScale = 1)
: m_absoluteTransform(absoluteTransform)
, m_filterScale(filterScale)
{ }
virtual ~Filter() = default;
void setSourceImage(std::unique_ptr<ImageBuffer>&& sourceImage) { m_sourceImage = WTFMove(sourceImage); }
ImageBuffer* sourceImage() { return m_sourceImage.get(); }
FloatSize filterResolution() const { return m_filterResolution; }
void setFilterResolution(const FloatSize& filterResolution) { m_filterResolution = filterResolution; }
float filterScale() const { return m_filterScale; }
void setFilterScale(float scale) { m_filterScale = scale; }
const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }
RenderingMode renderingMode() const { return m_renderingMode; }
void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; }
virtual bool isSVGFilter() const { return false; }
virtual bool isCSSFilter() const { return false; }
virtual FloatSize scaledByFilterResolution(FloatSize size) const { return size * m_filterResolution; }
virtual FloatRect sourceImageRect() const = 0;
virtual FloatRect filterRegion() const = 0;
virtual FloatRect filterRegionInUserSpace() const = 0;
protected:
explicit Filter(const FloatSize& filterResolution)
: m_filterResolution(filterResolution)
{
}
private:
std::unique_ptr<ImageBuffer> m_sourceImage;
FloatSize m_filterResolution;
AffineTransform m_absoluteTransform;
RenderingMode m_renderingMode { Unaccelerated };
float m_filterScale { 1 };
};
}