#ifndef CachedImage_h
#define CachedImage_h
#include "CachedResource.h"
#include "CachedResourceClient.h"
#include "SVGImageCache.h"
#include "ImageObserver.h"
#include "IntRect.h"
#include "Timer.h"
#include <wtf/Vector.h>
namespace WebCore {
class CachedResourceLoader;
class FloatSize;
class MemoryCache;
class RenderObject;
struct Length;
class CachedImage : public CachedResource, public ImageObserver {
friend class MemoryCache;
public:
CachedImage(const ResourceRequest&);
CachedImage(Image*);
virtual ~CachedImage();
virtual void load(CachedResourceLoader*, const ResourceLoaderOptions&);
Image* image(); Image* imageForRenderer(const RenderObject*); bool hasImage() const { return m_image.get(); }
std::pair<Image*, float> brokenImage(float deviceScaleFactor) const; bool willPaintBrokenImage() const;
bool canRender(const RenderObject* renderer, float multiplier) { return !errorOccurred() && !imageSizeForRenderer(renderer, multiplier).isEmpty(); }
void setContainerSizeForRenderer(const RenderObject*, const IntSize&, float);
bool usesImageContainerSize() const;
bool imageHasRelativeWidth() const;
bool imageHasRelativeHeight() const;
IntSize imageSizeForRenderer(const RenderObject*, float multiplier); void computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio);
void removeClientForRenderer(RenderObject*);
virtual void didAddClient(CachedResourceClient*);
virtual void allClientsRemoved();
virtual void destroyDecodedData();
virtual void data(PassRefPtr<SharedBuffer> data, bool allDataReceived);
virtual void error(CachedResource::Status);
virtual void setResponse(const ResourceResponse&);
virtual bool shouldIgnoreHTTPStatusCodeErrors() const { return true; }
virtual bool isImage() const { return true; }
bool stillNeedsLoad() const { return !errorOccurred() && status() == Unknown && !isLoading(); }
void load();
virtual void decodedSizeChanged(const Image* image, int delta);
virtual void didDraw(const Image*);
virtual bool shouldPauseAnimation(const Image*);
virtual void animationAdvanced(const Image*);
virtual void changedInRect(const Image*, const IntRect&);
private:
Image* lookupOrCreateImageForRenderer(const RenderObject*);
void clear();
void createImage();
size_t maximumDecodedImageSize();
void notifyObservers(const IntRect* changeRect = 0);
void decodedDataDeletionTimerFired(Timer<CachedImage>*);
virtual PurgePriority purgePriority() const { return PurgeFirst; }
void checkShouldPaintBrokenImage();
RefPtr<Image> m_image;
#if ENABLE(SVG)
OwnPtr<SVGImageCache> m_svgImageCache;
#endif
Timer<CachedImage> m_decodedDataDeletionTimer;
bool m_shouldPaintBrokenImage;
};
class CachedImageClient : public CachedResourceClient {
public:
virtual ~CachedImageClient() { }
static CachedResourceClientType expectedType() { return ImageType; }
virtual CachedResourceClientType resourceClientType() { return expectedType(); }
virtual void imageChanged(CachedImage*, const IntRect* = 0) { }
virtual bool willRenderImage(CachedImage*) { return false; }
};
}
#endif