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 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 blink { 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 FINAL : public Resource, public ImageObserver { 45 friend class MemoryCache; 46 47 public: 48 typedef ImageResourceClient ClientType; 49 50 ImageResource(const ResourceRequest&); 51 ImageResource(blink::Image*); 52 // Exposed for testing 53 ImageResource(const ResourceRequest&, blink::Image*); 54 virtual ~ImageResource(); 55 56 virtual void load(ResourceFetcher*, const ResourceLoaderOptions&) OVERRIDE; 57 58 blink::Image* image(); // Returns the nullImage() if the image is not available yet. 59 blink::Image* imageForRenderer(const RenderObject*); // Returns the nullImage() if the image is not available yet. hasImage()60 bool hasImage() const { return m_image.get(); } 61 bool currentFrameKnownToBeOpaque(const RenderObject*); // Side effect: ensures decoded image is in cache, therefore should only be called when about to draw the image. 62 63 static std::pair<blink::Image*, float> brokenImage(float deviceScaleFactor); // Returns an image and the image's resolution scale factor. 64 bool willPaintBrokenImage() const; 65 canRender(const RenderObject & renderer,float multiplier)66 bool canRender(const RenderObject& renderer, float multiplier) { return !errorOccurred() && !imageSizeForRenderer(&renderer, multiplier).isEmpty(); } 67 68 void setContainerSizeForRenderer(const ImageResourceClient*, const IntSize&, float); 69 bool usesImageContainerSize() const; 70 bool imageHasRelativeWidth() const; 71 bool imageHasRelativeHeight() const; 72 // The device pixel ratio we got from the server for this image, or 1.0. devicePixelRatioHeaderValue()73 float devicePixelRatioHeaderValue() const { return m_devicePixelRatioHeaderValue; } hasDevicePixelRatioHeaderValue()74 bool hasDevicePixelRatioHeaderValue() const { return m_hasDevicePixelRatioHeaderValue; } 75 76 enum SizeType { 77 NormalSize, // Report the size of the image associated with a certain renderer 78 IntrinsicSize // Report the intrinsic size, i.e. ignore whatever has been set extrinsically. 79 }; 80 // This method takes a zoom multiplier that can be used to increase the natural size of the image by the zoom. 81 LayoutSize imageSizeForRenderer(const RenderObject*, float multiplier, SizeType = NormalSize); // returns the size of the complete image. 82 void computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio); 83 84 static void updateBitmapImages(HashSet<ImageResource*>&, bool redecodeImages = false); 85 86 bool isAccessAllowed(SecurityOrigin*); 87 88 virtual void didAddClient(ResourceClient*) OVERRIDE; 89 virtual void didRemoveClient(ResourceClient*) OVERRIDE; 90 91 virtual void allClientsRemoved() OVERRIDE; 92 93 virtual void appendData(const char*, int) OVERRIDE; 94 virtual void error(Resource::Status) OVERRIDE; 95 virtual void responseReceived(const ResourceResponse&) OVERRIDE; 96 virtual void finishOnePart() OVERRIDE; 97 98 // For compatibility, images keep loading even if there are HTTP errors. shouldIgnoreHTTPStatusCodeErrors()99 virtual bool shouldIgnoreHTTPStatusCodeErrors() const OVERRIDE { return true; } 100 isImage()101 virtual bool isImage() const OVERRIDE { return true; } stillNeedsLoad()102 virtual bool stillNeedsLoad() const OVERRIDE { return !errorOccurred() && status() == Unknown && !isLoading(); } 103 104 // ImageObserver 105 virtual void decodedSizeChanged(const blink::Image*, int delta) OVERRIDE; 106 virtual void didDraw(const blink::Image*) OVERRIDE; 107 108 virtual bool shouldPauseAnimation(const blink::Image*) OVERRIDE; 109 virtual void animationAdvanced(const blink::Image*) OVERRIDE; 110 virtual void changedInRect(const blink::Image*, const IntRect&) OVERRIDE; 111 112 protected: 113 virtual bool isSafeToUnlock() const OVERRIDE; 114 virtual void destroyDecodedDataIfPossible() OVERRIDE; 115 116 private: 117 void clear(); 118 119 void setCustomAcceptHeader(); 120 void createImage(); 121 void updateImage(bool allDataReceived); 122 void clearImage(); 123 // If not null, changeRect is the changed part of the image. 124 void notifyObservers(const IntRect* changeRect = 0); 125 126 virtual void switchClientsToRevalidatedResource() OVERRIDE; 127 128 typedef pair<IntSize, float> SizeAndZoom; 129 typedef HashMap<const ImageResourceClient*, SizeAndZoom> ContainerSizeRequests; 130 ContainerSizeRequests m_pendingContainerSizeRequests; 131 float m_devicePixelRatioHeaderValue; 132 133 RefPtr<blink::Image> m_image; 134 OwnPtr<SVGImageCache> m_svgImageCache; 135 bool m_loadingMultipartContent; 136 bool m_hasDevicePixelRatioHeaderValue; 137 }; 138 139 DEFINE_RESOURCE_TYPE_CASTS(Image); 140 141 } 142 143 #endif 144