• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     IsAnimated onIsAnimated() override;
50 
getFrameHolder()51     const SkFrameHolder* getFrameHolder() const override {
52         return &fFrameHolder;
53     }
54 
55 private:
56     SkWebpCodec(SkEncodedInfo&&, std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>,
57                 SkEncodedOrigin);
58 
59     SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux;
60 
61     // fDemux has a pointer into this data.
62     // This should not be freed until the decode is completed.
63     sk_sp<SkData> fData;
64 
65     class Frame : public SkFrame {
66     public:
Frame(int i,SkEncodedInfo::Alpha alpha)67         Frame(int i, SkEncodedInfo::Alpha alpha)
68             : INHERITED(i)
69             , fReportedAlpha(alpha)
70         {}
71 
72     protected:
onReportedAlpha()73         SkEncodedInfo::Alpha onReportedAlpha() const override {
74             return fReportedAlpha;
75         }
76 
77     private:
78         const SkEncodedInfo::Alpha fReportedAlpha;
79 
80         using INHERITED = SkFrame;
81     };
82 
83     class FrameHolder : public SkFrameHolder {
84     public:
~FrameHolder()85         ~FrameHolder() override {}
setScreenSize(int w,int h)86         void setScreenSize(int w, int h) {
87             fScreenWidth = w;
88             fScreenHeight = h;
89         }
90         Frame* appendNewFrame(bool hasAlpha);
91         const Frame* frame(int i) const;
size()92         int size() const {
93             return static_cast<int>(fFrames.size());
94         }
reserve(int size)95         void reserve(int size) {
96             fFrames.reserve(size);
97         }
98 
99     protected:
100         const SkFrame* onGetFrame(int i) const override;
101 
102     private:
103         std::vector<Frame> fFrames;
104     };
105 
106     FrameHolder fFrameHolder;
107     // Set to true if WebPDemuxGetFrame fails. This only means
108     // that we will cap the frame count to the frames that
109     // succeed.
110     bool        fFailed;
111 
112     using INHERITED = SkScalingCodec;
113 };
114 #endif // SkWebpCodec_DEFINED
115