REGRESSION(r215211): [GTK] Several webgl related tests are failing
[WebKit-https.git] / Source / WebCore / platform / image-decoders / gif / GIFImageDecoder.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 #pragma once
27
28 #include "ImageDecoder.h"
29 #include <wtf/Lock.h>
30
31 class GIFImageReader;
32
33 namespace WebCore {
34
35     // This class decodes the GIF image format.
36     class GIFImageDecoder final : public ImageDecoder {
37     public:
38         static Ref<ImageDecoder> create(AlphaOption alphaOption, GammaAndColorProfileOption gammaAndColorProfileOption)
39         {
40             return adoptRef(*new GIFImageDecoder(alphaOption, gammaAndColorProfileOption));
41         }
42
43         virtual ~GIFImageDecoder();
44
45         enum GIFQuery { GIFFullQuery, GIFSizeQuery, GIFFrameCountQuery };
46
47         // ImageDecoder
48         String filenameExtension() const override { return ASCIILiteral("gif"); }
49         void setData(SharedBuffer& data, bool allDataReceived) override;
50         bool setSize(const IntSize&) override;
51         size_t frameCount() const override;
52         RepetitionCount repetitionCount() const override;
53         ImageFrame* frameBufferAtIndex(size_t index) override;
54         // CAUTION: setFailed() deletes |m_reader|.  Be careful to avoid
55         // accessing deleted memory, especially when calling this from inside
56         // GIFImageReader!
57         bool setFailed() override;
58         void clearFrameBufferCache(size_t clearBeforeFrame) override;
59
60         // Callbacks from the GIF reader.
61         bool haveDecodedRow(unsigned frameIndex, const Vector<unsigned char>& rowBuffer, size_t width, size_t rowNumber, unsigned repeatCount, bool writeTransparentPixels);
62         bool frameComplete(unsigned frameIndex, unsigned frameDuration, ImageFrame::DisposalMethod);
63         void gifComplete();
64
65     private:
66         GIFImageDecoder(AlphaOption, GammaAndColorProfileOption);
67         void tryDecodeSize(bool allDataReceived) override { decode(0, GIFSizeQuery, allDataReceived); }
68
69         // If the query is GIFFullQuery, decodes the image up to (but not
70         // including) |haltAtFrame|.  Otherwise, decodes as much as is needed to
71         // answer the query, ignoring bitmap data.  If decoding fails but there
72         // is no more data coming, sets the "decode failure" flag.
73         void decode(unsigned haltAtFrame, GIFQuery, bool allDataReceived);
74
75         // Called to initialize the frame buffer with the given index, based on
76         // the previous frame's disposal method. Returns true on success. On
77         // failure, this will mark the image as failed.
78         bool initFrameBuffer(unsigned frameIndex);
79
80         bool m_currentBufferSawAlpha;
81         mutable RepetitionCount m_repetitionCount { RepetitionCountOnce };
82         std::unique_ptr<GIFImageReader> m_reader;
83         Lock m_decodeLock;
84     };
85
86 } // namespace WebCore