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