blob: b4b4677e8911b775b5ec3d60e5d04d0aa66e3e86 [file] [log] [blame]
scroggo6f5e6192015-06-18 12:53:43 -07001/*
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 "SkCodec.h"
Hal Canarydb683012016-11-23 08:55:18 -070012#include "SkEncodedImageFormat.h"
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040013#include "SkFrameHolder.h"
scroggo6f5e6192015-06-18 12:53:43 -070014#include "SkImageInfo.h"
15#include "SkTypes.h"
16
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040017#include <vector>
18
scroggo6f5e6192015-06-18 12:53:43 -070019class SkStream;
msarettff2a6c82016-09-07 11:23:28 -070020extern "C" {
21 struct WebPDemuxer;
22 void WebPDemuxDelete(WebPDemuxer* dmux);
23}
scroggo6f5e6192015-06-18 12:53:43 -070024
25class SkWebpCodec final : public SkCodec {
26public:
27 // Assumes IsWebp was called and returned true.
Mike Reedede7bac2017-07-23 15:30:02 -040028 static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
scroggodb30be22015-12-08 18:54:13 -080029 static bool IsWebp(const void*, size_t);
scroggo6f5e6192015-06-18 12:53:43 -070030protected:
Leon Scroggins571b30f2017-07-11 17:35:31 +000031 Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*) override;
Hal Canarydb683012016-11-23 08:55:18 -070032 SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kWEBP; }
scroggo6f5e6192015-06-18 12:53:43 -070033
scroggo6f5e6192015-06-18 12:53:43 -070034 SkISize onGetScaledDimensions(float desiredScale) const override;
scroggob636b452015-07-22 07:16:20 -070035
scroggoe7fc14b2015-10-02 13:14:46 -070036 bool onDimensionsSupported(const SkISize&) override;
37
scroggob636b452015-07-22 07:16:20 -070038 bool onGetValidSubset(SkIRect* /* desiredSubset */) const override;
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040039
40 int onGetFrameCount() override;
41 bool onGetFrameInfo(int, FrameInfo*) const override;
42 int onGetRepetitionCount() override;
43
Leon Scroggins III1f6af6b2017-06-12 16:41:09 -040044 const SkFrameHolder* getFrameHolder() const override {
45 return &fFrameHolder;
46 }
47
scroggo6f5e6192015-06-18 12:53:43 -070048private:
Leon Scroggins III36f7e322018-08-27 11:55:46 -040049 SkWebpCodec(SkEncodedInfo&&, std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>,
50 SkEncodedOrigin);
msarettff2a6c82016-09-07 11:23:28 -070051
52 SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux;
53
54 // fDemux has a pointer into this data.
55 // This should not be freed until the decode is completed.
56 sk_sp<SkData> fData;
scroggo6f5e6192015-06-18 12:53:43 -070057
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040058 class Frame : public SkFrame {
59 public:
Leon Scroggins IIIc8037dc2017-12-05 13:55:24 -050060 Frame(int i, SkEncodedInfo::Alpha alpha)
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040061 : INHERITED(i)
Leon Scroggins IIIc8037dc2017-12-05 13:55:24 -050062 , fReportedAlpha(alpha)
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040063 {}
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040064
65 protected:
Leon Scroggins IIIc8037dc2017-12-05 13:55:24 -050066 SkEncodedInfo::Alpha onReportedAlpha() const override {
67 return fReportedAlpha;
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040068 }
69
70 private:
Leon Scroggins IIIc8037dc2017-12-05 13:55:24 -050071 const SkEncodedInfo::Alpha fReportedAlpha;
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040072
73 typedef SkFrame INHERITED;
74 };
75
76 class FrameHolder : public SkFrameHolder {
77 public:
78 ~FrameHolder() override {}
79 void setScreenSize(int w, int h) {
80 fScreenWidth = w;
81 fScreenHeight = h;
82 }
83 Frame* appendNewFrame(bool hasAlpha);
84 const Frame* frame(int i) const;
85 int size() const {
86 return static_cast<int>(fFrames.size());
87 }
88 void reserve(int size) {
89 fFrames.reserve(size);
90 }
91
92 protected:
93 const SkFrame* onGetFrame(int i) const override;
94
95 private:
96 std::vector<Frame> fFrames;
97 };
98
99 FrameHolder fFrameHolder;
100 // Set to true if WebPDemuxGetFrame fails. This only means
101 // that we will cap the frame count to the frames that
102 // succeed.
103 bool fFailed;
104
scroggo6f5e6192015-06-18 12:53:43 -0700105 typedef SkCodec INHERITED;
106};
107#endif // SkWebpCodec_DEFINED