1 /* 2 Copyright (C) 1998 Lars Knoll (knoll (at) mpi-hd.mpg.de) 3 Copyright (C) 2001 Dirk Mueller <mueller (at) kde.org> 4 Copyright (C) 2006 Samuel Weinig (sam.weinig (at) 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 ImageResource_h 24 #define ImageResource_h 25 26 #include "core/fetch/ResourcePtr.h" 27 #include "core/svg/graphics/SVGImageCache.h" 28 #include "platform/geometry/IntRect.h" 29 #include "platform/geometry/IntSizeHash.h" 30 #include "platform/geometry/LayoutSize.h" 31 #include "platform/graphics/ImageObserver.h" 32 #include "wtf/HashMap.h" 33 34 namespace WebCore { 35 36 class ImageResourceClient; 37 class ResourceFetcher; 38 class FloatSize; 39 class Length; 40 class MemoryCache; 41 class RenderObject; 42 class SecurityOrigin; 43 44 class ImageResource : public Resource, public ImageObserver { 45 friend class MemoryCache; 46 47 public: 48 typedef ImageResourceClient ClientType; 49 50 ImageResource(const ResourceRequest&); 51 ImageResource(WebCore::Image*); 52 virtual ~ImageResource(); 53 54 virtual void load(ResourceFetcher*, const ResourceLoaderOptions&); 55 56 WebCore::Image* image(); // Returns the nullImage() if the image is not available yet. 57 WebCore::Image* imageForRenderer(const RenderObject*); // Returns the nullImage() if the image is not available yet. 58 bool hasImage() const { return m_image.get(); } 59 bool currentFrameKnownToBeOpaque(const RenderObject*); // Side effect: ensures decoded image is in cache, therefore should only be called when about to draw the image. 60 61 static std::pair<WebCore::Image*, float> brokenImage(float deviceScaleFactor); // Returns an image and the image's resolution scale factor. 62 bool willPaintBrokenImage() const; 63 64 bool canRender(const RenderObject* renderer, float multiplier) { return !errorOccurred() && !imageSizeForRenderer(renderer, multiplier).isEmpty(); } 65 66 void setContainerSizeForRenderer(const ImageResourceClient*, const IntSize&, float); 67 bool usesImageContainerSize() const; 68 bool imageHasRelativeWidth() const; 69 bool imageHasRelativeHeight() const; 70 // The device pixel ratio we got from the server for this image, or 1.0. 71 float devicePixelRatioHeaderValue() const { return m_devicePixelRatioHeaderValue; } 72 bool hasDevicePixelRatioHeaderValue() const { return m_hasDevicePixelRatioHeaderValue; } 73 74 enum SizeType { 75 NormalSize, // Report the size of the image associated with a certain renderer 76 IntrinsicSize // Report the intrinsic size, i.e. ignore whatever has been set extrinsically. 77 }; 78 // This method takes a zoom multiplier that can be used to increase the natural size of the image by the zoom. 79 LayoutSize imageSizeForRenderer(const RenderObject*, float multiplier, SizeType = NormalSize); // returns the size of the complete image. 80 void computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio); 81 82 bool isAccessAllowed(SecurityOrigin*); 83 84 virtual void didAddClient(ResourceClient*); 85 virtual void didRemoveClient(ResourceClient*); 86 87 virtual void allClientsRemoved(); 88 virtual void destroyDecodedData(); 89 90 virtual void appendData(const char*, int) OVERRIDE; 91 virtual void error(Resource::Status); 92 virtual void responseReceived(const ResourceResponse&); 93 virtual void finishOnePart() OVERRIDE; 94 95 // For compatibility, images keep loading even if there are HTTP errors. 96 virtual bool shouldIgnoreHTTPStatusCodeErrors() const { return true; } 97 98 virtual bool isImage() const { return true; } 99 virtual bool stillNeedsLoad() const OVERRIDE { return !errorOccurred() && status() == Unknown && !isLoading(); } 100 101 // ImageObserver 102 virtual void decodedSizeChanged(const WebCore::Image*, int delta); 103 virtual void didDraw(const WebCore::Image*); 104 105 virtual bool shouldPauseAnimation(const WebCore::Image*); 106 virtual void animationAdvanced(const WebCore::Image*); 107 virtual void changedInRect(const WebCore::Image*, const IntRect&); 108 109 private: 110 void clear(); 111 112 void setCustomAcceptHeader(); 113 void createImage(); 114 void updateImage(bool allDataReceived); 115 void clearImage(); 116 // If not null, changeRect is the changed part of the image. 117 void notifyObservers(const IntRect* changeRect = 0); 118 119 virtual void switchClientsToRevalidatedResource() OVERRIDE; 120 121 typedef pair<IntSize, float> SizeAndZoom; 122 typedef HashMap<const ImageResourceClient*, SizeAndZoom> ContainerSizeRequests; 123 ContainerSizeRequests m_pendingContainerSizeRequests; 124 float m_devicePixelRatioHeaderValue; 125 126 RefPtr<WebCore::Image> m_image; 127 OwnPtr<SVGImageCache> m_svgImageCache; 128 bool m_loadingMultipartContent; 129 bool m_hasDevicePixelRatioHeaderValue; 130 }; 131 132 DEFINE_RESOURCE_TYPE_CASTS(Image); 133 134 } 135 136 #endif 137