xref: /third_party/skia/src/codec/SkWebpCodec.h (revision cb93a386)
1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkWebpCodec_DEFINED
9#define SkWebpCodec_DEFINED
10
11#include "include/codec/SkCodec.h"
12#include "include/core/SkEncodedImageFormat.h"
13#include "include/core/SkImageInfo.h"
14#include "include/core/SkTypes.h"
15#include "src/codec/SkFrameHolder.h"
16#include "src/codec/SkScalingCodec.h"
17
18#include <vector>
19
20class SkStream;
21extern "C" {
22    struct WebPDemuxer;
23    void WebPDemuxDelete(WebPDemuxer* dmux);
24}
25
26class SkWebpCodec final : public SkScalingCodec {
27public:
28    // Assumes IsWebp was called and returned true.
29    static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
30    static bool IsWebp(const void*, size_t);
31protected:
32    Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*) override;
33    SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kWEBP; }
34
35    bool onGetValidSubset(SkIRect* /* desiredSubset */) const override;
36
37    int onGetFrameCount() override;
38    bool onGetFrameInfo(int, FrameInfo*) const override;
39    int onGetRepetitionCount() override;
40
41    const SkFrameHolder* getFrameHolder() const override {
42        return &fFrameHolder;
43    }
44
45private:
46    SkWebpCodec(SkEncodedInfo&&, std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>,
47                SkEncodedOrigin);
48
49    SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux;
50
51    // fDemux has a pointer into this data.
52    // This should not be freed until the decode is completed.
53    sk_sp<SkData> fData;
54
55    class Frame : public SkFrame {
56    public:
57        Frame(int i, SkEncodedInfo::Alpha alpha)
58            : INHERITED(i)
59            , fReportedAlpha(alpha)
60        {}
61
62    protected:
63        SkEncodedInfo::Alpha onReportedAlpha() const override {
64            return fReportedAlpha;
65        }
66
67    private:
68        const SkEncodedInfo::Alpha fReportedAlpha;
69
70        using INHERITED = SkFrame;
71    };
72
73    class FrameHolder : public SkFrameHolder {
74    public:
75        ~FrameHolder() override {}
76        void setScreenSize(int w, int h) {
77            fScreenWidth = w;
78            fScreenHeight = h;
79        }
80        Frame* appendNewFrame(bool hasAlpha);
81        const Frame* frame(int i) const;
82        int size() const {
83            return static_cast<int>(fFrames.size());
84        }
85        void reserve(int size) {
86            fFrames.reserve(size);
87        }
88
89    protected:
90        const SkFrame* onGetFrame(int i) const override;
91
92    private:
93        std::vector<Frame> fFrames;
94    };
95
96    FrameHolder fFrameHolder;
97    // Set to true if WebPDemuxGetFrame fails. This only means
98    // that we will cap the frame count to the frames that
99    // succeed.
100    bool        fFailed;
101
102    using INHERITED = SkScalingCodec;
103};
104#endif // SkWebpCodec_DEFINED
105