REGRESSION (216471): Infinite repaint-drawing loop when asynchronously decoding incom...
[WebKit-https.git] / Source / WebCore / platform / graphics / ImageFrame.h
1 /*
2  * Copyright (C) 2016 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "Color.h"
29 #include "DecodingOptions.h"
30 #include "ImageBackingStore.h"
31 #include "ImageOrientation.h"
32 #include "ImageTypes.h"
33 #include "IntSize.h"
34 #include "NativeImage.h"
35 #include <wtf/Deque.h>
36
37 namespace WebCore {
38
39 class ImageFrame {
40     friend class ImageFrameCache;
41 public:
42     enum class Caching { Metadata, MetadataAndImage };
43     enum class DecodingStatus { Invalid, Partial, Complete, Decoding };
44
45     ImageFrame();
46     ImageFrame(const ImageFrame& other) { operator=(other); }
47
48     ~ImageFrame();
49
50     static const ImageFrame& defaultFrame();
51
52     ImageFrame& operator=(const ImageFrame& other);
53
54     unsigned clearImage();
55     unsigned clear();
56
57 #if !USE(CG)
58     bool initialize(const ImageBackingStore&);
59     bool initialize(const IntSize&, bool premultiplyAlpha);
60 #endif
61
62     void setDecodingStatus(DecodingStatus);
63     DecodingStatus decodingStatus() const;
64
65     bool isInvalid() const { return m_decodingStatus == DecodingStatus::Invalid; }
66     bool isPartial() const { return m_decodingStatus == DecodingStatus::Partial; }
67     bool isComplete() const { return m_decodingStatus == DecodingStatus::Complete; }
68
69     IntSize size() const;
70     IntSize sizeRespectingOrientation() const { return !m_orientation.usesWidthAsHeight() ? size() : size().transposedSize(); }
71     unsigned frameBytes() const { return hasNativeImage() ? (size().area() * sizeof(RGBA32)).unsafeGet() : 0; }
72     SubsamplingLevel subsamplingLevel() const { return m_subsamplingLevel; }
73
74 #if !USE(CG)
75     enum class DisposalMethod { Unspecified, DoNotDispose, RestoreToBackground, RestoreToPrevious };
76     void setDisposalMethod(DisposalMethod method) { m_disposalMethod = method; }
77     DisposalMethod disposalMethod() const { return m_disposalMethod; }
78 #endif
79
80     NativeImagePtr nativeImage() const { return m_nativeImage; }
81
82     void setOrientation(ImageOrientation orientation) { m_orientation = orientation; };
83     ImageOrientation orientation() const { return m_orientation; }
84
85     void setDuration(float duration) { m_duration = duration; }
86     float duration() const { return m_duration; }
87
88     void setHasAlpha(bool hasAlpha) { m_hasAlpha = hasAlpha; }
89     bool hasAlpha() const { return !hasMetadata() || m_hasAlpha; }
90
91     bool hasNativeImage(const std::optional<SubsamplingLevel>& = { }) const;
92     bool hasFullSizeNativeImage(const std::optional<SubsamplingLevel>& = { }) const;
93     bool hasDecodedNativeImageCompatibleWithOptions(const std::optional<SubsamplingLevel>&, const DecodingOptions&) const;
94     bool hasMetadata() const { return !size().isEmpty(); }
95
96 #if !USE(CG)
97     ImageBackingStore* backingStore() const { return m_backingStore ? m_backingStore.get() : nullptr; }
98     bool hasBackingStore() const { return backingStore(); }
99 #endif
100
101     Color singlePixelSolidColor() const;
102
103 private:
104     DecodingStatus m_decodingStatus { DecodingStatus::Invalid };
105     IntSize m_size;
106
107 #if !USE(CG)
108     std::unique_ptr<ImageBackingStore> m_backingStore;
109     DisposalMethod m_disposalMethod { DisposalMethod::Unspecified };
110 #endif
111
112     NativeImagePtr m_nativeImage;
113     SubsamplingLevel m_subsamplingLevel { SubsamplingLevel::Default };
114     DecodingOptions m_decodingOptions;
115
116     ImageOrientation m_orientation { DefaultImageOrientation };
117     float m_duration { 0 };
118     bool m_hasAlpha { true };
119 };
120
121 }