Remove "virtual" from all lines that have both "virtual" and "override".
[WebKit-https.git] / Source / WebCore / platform / image-decoders / png / PNGImageDecoder.h
1 /*
2  * Copyright (C) 2006 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 #ifndef PNGImageDecoder_h
27 #define PNGImageDecoder_h
28
29 #include "ImageDecoder.h"
30 #if ENABLE(APNG)
31 #include <png.h>
32 #endif
33
34 namespace WebCore {
35
36     class PNGImageReader;
37
38     // This class decodes the PNG image format.
39     class PNGImageDecoder : public ImageDecoder {
40     public:
41         PNGImageDecoder(ImageSource::AlphaOption, ImageSource::GammaAndColorProfileOption);
42         virtual ~PNGImageDecoder();
43
44         // ImageDecoder
45         String filenameExtension() const override { return "png"; }
46 #if ENABLE(APNG)
47         size_t frameCount() override { return m_frameCount; }
48         int repetitionCount() const override { return m_playCount-1; }
49 #endif
50         bool isSizeAvailable() override;
51         bool setSize(unsigned width, unsigned height) override;
52         ImageFrame* frameBufferAtIndex(size_t index) override;
53         // CAUTION: setFailed() deletes |m_reader|.  Be careful to avoid
54         // accessing deleted memory, especially when calling this from inside
55         // PNGImageReader!
56         bool setFailed() override;
57
58         // Callbacks from libpng
59         void headerAvailable();
60         void rowAvailable(unsigned char* rowBuffer, unsigned rowIndex, int interlacePass);
61         void pngComplete();
62 #if ENABLE(APNG)
63         void readChunks(png_unknown_chunkp);
64         void frameHeader();
65
66         void init();
67         void clearFrameBufferCache(size_t clearBeforeFrame) override;
68 #endif
69
70         bool isComplete() const
71         {
72             if (m_frameBufferCache.isEmpty())
73                 return false;
74
75             for (auto& imageFrame : m_frameBufferCache) {
76                 if (imageFrame.status() != ImageFrame::FrameComplete)
77                     return false;
78             }
79
80             return true;
81         }
82
83         bool isCompleteAtIndex(size_t index)
84         {
85             return (index < m_frameBufferCache.size() && m_frameBufferCache[index].status() == ImageFrame::FrameComplete);
86         }
87
88     private:
89         // Decodes the image.  If |onlySize| is true, stops decoding after
90         // calculating the image size.  If decoding fails but there is no more
91         // data coming, sets the "decode failure" flag.
92         void decode(bool onlySize, unsigned haltAtFrame);
93 #if ENABLE(APNG)
94         void initFrameBuffer(size_t frameIndex);
95         void frameComplete();
96         int processingStart(png_unknown_chunkp);
97         int processingFinish();
98         void fallbackNotAnimated();
99 #endif
100
101         std::unique_ptr<PNGImageReader> m_reader;
102         bool m_doNothingOnFailure;
103         unsigned m_currentFrame;
104 #if ENABLE(APNG)
105         png_structp m_png;
106         png_infop m_info;
107         bool m_isAnimated;
108         bool m_frameInfo;
109         bool m_frameIsHidden;
110         bool m_hasInfo;
111         int m_gamma;
112         size_t m_frameCount;
113         unsigned m_playCount;
114         unsigned m_totalFrames;
115         unsigned m_sizePLTE;
116         unsigned m_sizetRNS;
117         unsigned m_sequenceNumber;
118         unsigned m_width;
119         unsigned m_height;
120         unsigned m_xOffset;
121         unsigned m_yOffset;
122         unsigned m_delayNumerator;
123         unsigned m_delayDenominator;
124         unsigned m_dispose;
125         unsigned m_blend;
126         png_byte m_dataIHDR[12 + 13];
127         png_byte m_dataPLTE[12 + 256 * 3];
128         png_byte m_datatRNS[12 + 256];
129 #endif
130     };
131
132 } // namespace WebCore
133
134 #endif