[CSS Shapes] CORS-enabled fetch for shape image values
[WebKit-https.git] / Source / WebCore / loader / cache / CachedImage.h
1 /*
2     Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3     Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
4     Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
5     Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20     Boston, MA 02110-1301, USA.
21 */
22
23 #ifndef CachedImage_h
24 #define CachedImage_h
25
26 #include "CachedResource.h"
27 #include "ImageObserver.h"
28 #include "IntRect.h"
29 #include "IntSizeHash.h"
30 #include "LayoutSize.h"
31 #include "SVGImageCache.h"
32 #include <wtf/HashMap.h>
33 #include <wtf/Vector.h>
34
35 namespace WebCore {
36
37 class CachedImageClient;
38 class CachedResourceLoader;
39 class FloatSize;
40 class MemoryCache;
41 class RenderElement;
42 class RenderObject;
43 class SecurityOrigin;
44
45 struct Length;
46
47 class CachedImage FINAL : public CachedResource, public ImageObserver {
48     friend class MemoryCache;
49
50 public:
51     CachedImage(const ResourceRequest&);
52     CachedImage(Image*);
53     virtual ~CachedImage();
54
55     Image* image(); // Returns the nullImage() if the image is not available yet.
56     Image* imageForRenderer(const RenderObject*); // Returns the nullImage() if the image is not available yet.
57     bool hasImage() const { return m_image.get(); }
58     bool currentFrameKnownToBeOpaque(const RenderElement*); // Side effect: ensures decoded image is in cache, therefore should only be called when about to draw the image.
59
60     std::pair<Image*, float> brokenImage(float deviceScaleFactor) const; // Returns an image and the image's resolution scale factor.
61     bool willPaintBrokenImage() const; 
62
63     bool canRender(const RenderObject* renderer, float multiplier) { return !errorOccurred() && !imageSizeForRenderer(renderer, multiplier).isEmpty(); }
64
65     void setContainerSizeForRenderer(const CachedImageClient*, const IntSize&, float);
66     bool usesImageContainerSize() const;
67     bool imageHasRelativeWidth() const;
68     bool imageHasRelativeHeight() const;
69
70     virtual void addDataBuffer(ResourceBuffer*) OVERRIDE;
71     virtual void finishLoading(ResourceBuffer*) OVERRIDE;
72
73     enum SizeType {
74         UsedSize,
75         IntrinsicSize
76     };
77     // This method takes a zoom multiplier that can be used to increase the natural size of the image by the zoom.
78     LayoutSize imageSizeForRenderer(const RenderObject*, float multiplier, SizeType = UsedSize); // returns the size of the complete image.
79     void computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio);
80
81     static void resumeAnimatingImagesForLoader(CachedResourceLoader*);
82
83 #if ENABLE(DISK_IMAGE_CACHE)
84     virtual bool canUseDiskImageCache() const OVERRIDE;
85     virtual void useDiskImageCache() OVERRIDE;
86 #endif
87
88     bool isOriginClean(SecurityOrigin*);
89
90 private:
91     virtual void load(CachedResourceLoader*, const ResourceLoaderOptions&) OVERRIDE;
92
93     void clear();
94
95     void createImage();
96     void clearImage();
97     bool canBeDrawn() const;
98     // If not null, changeRect is the changed part of the image.
99     void notifyObservers(const IntRect* changeRect = 0);
100     virtual PurgePriority purgePriority() const OVERRIDE { return PurgeFirst; }
101     void checkShouldPaintBrokenImage();
102
103     virtual void switchClientsToRevalidatedResource() OVERRIDE;
104     virtual bool mayTryReplaceEncodedData() const OVERRIDE { return true; }
105
106     virtual void didAddClient(CachedResourceClient*) OVERRIDE;
107     virtual void didRemoveClient(CachedResourceClient*) OVERRIDE;
108
109     virtual void allClientsRemoved() OVERRIDE;
110     virtual void destroyDecodedData() OVERRIDE;
111
112     virtual void addData(const char* data, unsigned length) OVERRIDE;
113     virtual void error(CachedResource::Status) OVERRIDE;
114     virtual void responseReceived(const ResourceResponse&) OVERRIDE;
115
116     // For compatibility, images keep loading even if there are HTTP errors.
117     virtual bool shouldIgnoreHTTPStatusCodeErrors() const OVERRIDE { return true; }
118
119     virtual bool isImage() const OVERRIDE { return true; }
120     virtual bool stillNeedsLoad() const OVERRIDE { return !errorOccurred() && status() == Unknown && !isLoading(); }
121
122     // ImageObserver
123     virtual void decodedSizeChanged(const Image*, int delta) OVERRIDE;
124     virtual void didDraw(const Image*) OVERRIDE;
125
126     virtual bool shouldPauseAnimation(const Image*) OVERRIDE;
127     virtual void animationAdvanced(const Image*) OVERRIDE;
128     virtual void changedInRect(const Image*, const IntRect&) OVERRIDE;
129
130     void addIncrementalDataBuffer(ResourceBuffer*);
131
132     typedef pair<IntSize, float> SizeAndZoom;
133     typedef HashMap<const CachedImageClient*, SizeAndZoom> ContainerSizeRequests;
134     ContainerSizeRequests m_pendingContainerSizeRequests;
135
136     RefPtr<Image> m_image;
137 #if ENABLE(SVG)
138     OwnPtr<SVGImageCache> m_svgImageCache;
139 #endif
140     bool m_shouldPaintBrokenImage;
141 };
142
143 }
144
145 #endif