#ifndef RenderLayerFilterInfo_h
#define RenderLayerFilterInfo_h
#include "core/dom/Element.h"
#include "core/fetch/DocumentResource.h"
#include "platform/geometry/LayoutRect.h"
#include "platform/graphics/filters/FilterOperation.h"
#include "wtf/HashMap.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefPtr.h"
namespace WebCore {
class FilterEffectRenderer;
class FilterOperations;
class RenderLayer;
class RenderLayerFilterInfo;
typedef HashMap<const RenderLayer*, RenderLayerFilterInfo*> RenderLayerFilterInfoMap;
class RenderLayerFilterInfo FINAL : public DocumentResourceClient {
public:
    static RenderLayerFilterInfo* filterInfoForRenderLayer(const RenderLayer*);
    static RenderLayerFilterInfo* createFilterInfoForRenderLayerIfNeeded(RenderLayer*);
    static void removeFilterInfoForRenderLayer(RenderLayer*);
    const LayoutRect& dirtySourceRect() const { return m_dirtySourceRect; }
    void expandDirtySourceRect(const LayoutRect& rect) { m_dirtySourceRect.unite(rect); }
    void resetDirtySourceRect() { m_dirtySourceRect = LayoutRect(); }
    FilterEffectRenderer* renderer() const { return m_renderer.get(); }
    void setRenderer(PassRefPtr<FilterEffectRenderer>);
    void updateReferenceFilterClients(const FilterOperations&);
    virtual void notifyFinished(Resource*) OVERRIDE;
    void removeReferenceFilterClients();
private:
    RenderLayerFilterInfo(RenderLayer*);
    virtual ~RenderLayerFilterInfo();
    RenderLayer* m_layer;
    RefPtr<FilterEffectRenderer> m_renderer;
    LayoutRect m_dirtySourceRect;
    static RenderLayerFilterInfoMap* s_filterMap;
    Vector<RefPtr<Element> > m_internalSVGReferences;
    Vector<ResourcePtr<DocumentResource> > m_externalSVGReferences;
};
} 
#endif