1/*
2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef StyleFetchedImageSet_h
27#define StyleFetchedImageSet_h
28
29#include "core/fetch/ImageResourceClient.h"
30#include "core/fetch/ResourcePtr.h"
31#include "core/rendering/style/StyleImage.h"
32#include "platform/geometry/LayoutSize.h"
33
34namespace blink {
35
36class ImageResource;
37class CSSImageSetValue;
38
39// This class keeps one cached image and has access to a set of alternatives.
40
41class StyleFetchedImageSet FINAL : public StyleImage, private ImageResourceClient {
42    WTF_MAKE_FAST_ALLOCATED;
43public:
44    static PassRefPtr<StyleFetchedImageSet> create(ImageResource* image, float imageScaleFactor, CSSImageSetValue* value)
45    {
46        return adoptRef(new StyleFetchedImageSet(image, imageScaleFactor, value));
47    }
48    virtual ~StyleFetchedImageSet();
49
50    virtual PassRefPtrWillBeRawPtr<CSSValue> cssValue() const OVERRIDE;
51
52    // FIXME: This is used by StyleImage for equals comparison, but this implementation
53    // only looks at the image from the set that we have loaded. I'm not sure if that is
54    // meaningful enough or not.
55    virtual WrappedImagePtr data() const OVERRIDE { return m_bestFitImage.get(); }
56
57    void clearImageSetValue() { m_imageSetValue = 0; }
58
59    virtual bool canRender(const RenderObject&, float multiplier) const OVERRIDE;
60    virtual bool isLoaded() const OVERRIDE;
61    virtual bool errorOccurred() const OVERRIDE;
62    virtual LayoutSize imageSize(const RenderObject*, float multiplier) const OVERRIDE;
63    virtual bool imageHasRelativeWidth() const OVERRIDE;
64    virtual bool imageHasRelativeHeight() const OVERRIDE;
65    virtual void computeIntrinsicDimensions(const RenderObject*, Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio) OVERRIDE;
66    virtual bool usesImageContainerSize() const OVERRIDE;
67    virtual void setContainerSizeForRenderer(const RenderObject*, const IntSize&, float) OVERRIDE;
68    virtual void addClient(RenderObject*) OVERRIDE;
69    virtual void removeClient(RenderObject*) OVERRIDE;
70    virtual PassRefPtr<Image> image(RenderObject*, const IntSize&) const OVERRIDE;
71    virtual float imageScaleFactor() const OVERRIDE { return m_imageScaleFactor; }
72    virtual bool knownToBeOpaque(const RenderObject*) const OVERRIDE;
73    virtual ImageResource* cachedImage() const OVERRIDE { return m_bestFitImage.get(); }
74
75private:
76    StyleFetchedImageSet(ImageResource*, float imageScaleFactor, CSSImageSetValue*);
77
78    ResourcePtr<ImageResource> m_bestFitImage;
79    float m_imageScaleFactor;
80
81    // FIXME: oilpan: Change to RawPtrWillBeMember when moving this class onto oilpan heap.
82    // Also add "if !ENABLE(OILPAN)" around clearImageSetValue above as well as around its
83    // caller since it should not be needed once both of the objects are on the heap and
84    // oilpan is enabled.
85    CSSImageSetValue* m_imageSetValue; // Not retained; it owns us.
86};
87
88DEFINE_STYLE_IMAGE_TYPE_CASTS(StyleFetchedImageSet, isImageResourceSet());
89
90} // namespace blink
91
92#endif // StyleFetchedImageSet_h
93