#ifndef SVGImageCache_h
#define SVGImageCache_h
#if ENABLE(SVG)
#include "Image.h"
#include "IntSize.h"
#include "Timer.h"
#include <wtf/HashMap.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class CachedImage;
class ImageBuffer;
class RenderObject;
class SVGImage;
class SVGImageCache {
public:
~SVGImageCache();
static PassOwnPtr<SVGImageCache> create(SVGImage* image)
{
return adoptPtr(new SVGImageCache(image));
}
struct SizeAndScales {
SizeAndScales()
: zoom(1)
, scale(1)
{
}
SizeAndScales(const IntSize& newSize, float newZoom, float newScale)
: size(newSize)
, zoom(newZoom)
, scale(newScale)
{
}
IntSize size;
float zoom;
float scale;
};
void removeRendererFromCache(const RenderObject*);
void setRequestedSizeAndScales(const RenderObject*, const SizeAndScales&);
SizeAndScales requestedSizeAndScales(const RenderObject*) const;
Image* lookupOrCreateBitmapImageForRenderer(const RenderObject*);
void imageContentChanged();
private:
SVGImageCache(SVGImage*);
void redraw();
void redrawTimerFired(Timer<SVGImageCache>*);
struct ImageData {
ImageData()
: imageNeedsUpdate(false)
, buffer(0)
{
}
ImageData(ImageBuffer* newBuffer, PassRefPtr<Image> newImage, const SizeAndScales& newSizeAndScales)
: imageNeedsUpdate(false)
, sizeAndScales(newSizeAndScales)
, buffer(newBuffer)
, image(newImage)
{
}
bool imageNeedsUpdate;
SizeAndScales sizeAndScales;
ImageBuffer* buffer;
RefPtr<Image> image;
};
typedef HashMap<const RenderObject*, SizeAndScales> SizeAndScalesMap;
typedef HashMap<const RenderObject*, ImageData> ImageDataMap;
SVGImage* m_svgImage;
SizeAndScalesMap m_sizeAndScalesMap;
ImageDataMap m_imageDataMap;
Timer<SVGImageCache> m_redrawTimer;
};
}
#endif // ENABLE(SVG)
#endif // SVGImageCache_h