15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23e6d4491e48613634a83c1957c72759da80987961Ben Murdoch#ifndef ImageResource_h
24e6d4491e48613634a83c1957c72759da80987961Ben Murdoch#define ImageResource_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch#include "core/loader/cache/Resource.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/ImageObserver.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/IntRect.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/IntSizeHash.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/LayoutSize.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/graphics/SVGImageCache.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass ImageResourceClient;
373464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdochclass ResourceFetcher;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FloatSize;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MemoryCache;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct Length;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43e6d4491e48613634a83c1957c72759da80987961Ben Murdochclass ImageResource : public Resource, public ImageObserver {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend class MemoryCache;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
47e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ImageResource(const ResourceRequest&);
48e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ImageResource(WebCore::Image*);
49e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    virtual ~ImageResource();
5002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
513464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    virtual void load(ResourceFetcher*, const ResourceLoaderOptions&);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    WebCore::Image* image(); // Returns the nullImage() if the image is not available yet.
54e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    WebCore::Image* imageForRenderer(const RenderObject*); // Returns the nullImage() if the image is not available yet.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasImage() const { return m_image.get(); }
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool currentFrameKnownToBeOpaque(const RenderObject*); // Side effect: ensures decoded image is in cache, therefore should only be called when about to draw the image.
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    std::pair<WebCore::Image*, float> brokenImage(float deviceScaleFactor) const; // Returns an image and the image's resolution scale factor.
5902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    bool willPaintBrokenImage() const;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canRender(const RenderObject* renderer, float multiplier) { return !errorOccurred() && !imageSizeForRenderer(renderer, multiplier).isEmpty(); }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    void setContainerSizeForRenderer(const ImageResourceClient*, const IntSize&, float);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool usesImageContainerSize() const;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool imageHasRelativeWidth() const;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool imageHasRelativeHeight() const;
6702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This method takes a zoom multiplier that can be used to increase the natural size of the image by the zoom.
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutSize imageSizeForRenderer(const RenderObject*, float multiplier); // returns the size of the complete image.
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio);
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didAddClient(ResourceClient*);
73fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void didRemoveClient(ResourceClient*);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void allClientsRemoved();
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void destroyDecodedData();
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void appendData(const char*, int) OVERRIDE;
79fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    virtual void error(Resource::Status);
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void responseReceived(const ResourceResponse&);
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void finishOnePart() OVERRIDE;
8202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For compatibility, images keep loading even if there are HTTP errors.
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool shouldIgnoreHTTPStatusCodeErrors() const { return true; }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isImage() const { return true; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool stillNeedsLoad() const OVERRIDE { return !errorOccurred() && status() == Unknown && !isLoading(); }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ImageObserver
90e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    virtual void decodedSizeChanged(const WebCore::Image*, int delta);
91e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    virtual void didDraw(const WebCore::Image*);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    virtual bool shouldPauseAnimation(const WebCore::Image*);
94e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    virtual void animationAdvanced(const WebCore::Image*);
95e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    virtual void changedInRect(const WebCore::Image*, const IntRect&);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clear();
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void setCustomAcceptHeader();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void createImage();
10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void updateImage(bool allDataReceived);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearImage();
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If not null, changeRect is the changed part of the image.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void notifyObservers(const IntRect* changeRect = 0);
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void switchClientsToRevalidatedResource() OVERRIDE;
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    typedef pair<IntSize, float> SizeAndZoom;
110e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    typedef HashMap<const ImageResourceClient*, SizeAndZoom> ContainerSizeRequests;
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ContainerSizeRequests m_pendingContainerSizeRequests;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
113e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    RefPtr<WebCore::Image> m_image;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<SVGImageCache> m_svgImageCache;
11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool m_loadingMultipartContent;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
121