FilterEffectRenderer.h [plain text]
#pragma once
#include "Filter.h"
#include "IntRectExtent.h"
#include "LayoutRect.h"
namespace WebCore {
class Document;
class FilterEffect;
class FilterOperations;
class GraphicsContext;
class ReferenceFilterOperation;
class RenderElement;
class RenderLayer;
class SourceGraphic;
enum FilterConsumer { FilterProperty, FilterFunction };
class FilterEffectRendererHelper {
WTF_MAKE_FAST_ALLOCATED;
public:
FilterEffectRendererHelper(bool haveFilterEffect, GraphicsContext& targetContext);
bool haveFilterEffect() const { return m_haveFilterEffect; }
bool hasStartedFilterEffect() const { return m_startedFilterEffect; }
bool prepareFilterEffect(RenderLayer&, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect, const LayoutRect& layerRepaintRect);
bool beginFilterEffect();
void applyFilterEffect(GraphicsContext& destinationContext);
GraphicsContext* filterContext() const;
const LayoutRect& repaintRect() const { return m_repaintRect; }
private:
RenderLayer* m_renderLayer { nullptr }; LayoutPoint m_paintOffset;
LayoutRect m_repaintRect;
const GraphicsContext& m_targetContext;
bool m_haveFilterEffect { false };
bool m_startedFilterEffect { false };
};
class FilterEffectRenderer final : public Filter {
WTF_MAKE_FAST_ALLOCATED;
public:
friend class FilterEffectRendererHelper;
static Ref<FilterEffectRenderer> create();
void setSourceImageRect(const FloatRect&);
void setFilterRegion(const FloatRect& filterRegion) { m_filterRegion = filterRegion; }
ImageBuffer* output() const;
bool build(RenderElement&, const FilterOperations&, FilterConsumer);
void clearIntermediateResults();
void apply();
bool hasFilterThatMovesPixels() const { return m_hasFilterThatMovesPixels; }
bool hasFilterThatShouldBeRestrictedBySecurityOrigin() const { return m_hasFilterThatShouldBeRestrictedBySecurityOrigin; }
private:
FilterEffectRenderer();
virtual ~FilterEffectRenderer();
FloatRect sourceImageRect() const final { return m_sourceDrawingRegion; }
FloatRect filterRegion() const final { return m_filterRegion; }
RefPtr<FilterEffect> buildReferenceFilter(RenderElement&, FilterEffect& previousEffect, ReferenceFilterOperation&);
void setMaxEffectRects(const FloatRect&);
GraphicsContext* inputContext();
bool updateBackingStoreRect(const FloatRect& filterRect);
void allocateBackingStoreIfNeeded(const GraphicsContext&);
IntRect outputRect() const;
LayoutRect computeSourceImageRectForDirtyRect(const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect);
FloatRect m_sourceDrawingRegion;
FloatRect m_filterRegion;
Vector<Ref<FilterEffect>> m_effects;
Ref<SourceGraphic> m_sourceGraphic;
IntRectExtent m_outsets;
bool m_graphicsBufferAttached { false };
bool m_hasFilterThatMovesPixels { false };
bool m_hasFilterThatShouldBeRestrictedBySecurityOrigin { false };
};
inline FilterEffectRendererHelper::FilterEffectRendererHelper(bool haveFilterEffect, GraphicsContext& targetContext)
: m_targetContext(targetContext)
, m_haveFilterEffect(haveFilterEffect)
{
}
inline void FilterEffectRenderer::setSourceImageRect(const FloatRect& sourceImageRect)
{
m_sourceDrawingRegion = sourceImageRect;
setMaxEffectRects(sourceImageRect);
setFilterRegion(sourceImageRect);
m_graphicsBufferAttached = false;
}
}