blob: 134dafa3d5b9dc8d617729d311e2ccc5349ed4c5 [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"
msarettad8bcfe2016-03-07 07:09:03 -080012#include "SkColorSpace.h"
Hal Canarydb683012016-11-23 08:55:18 -070013#include "SkEncodedImageFormat.h"
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040014#include "SkFrameHolder.h"
scroggo6f5e6192015-06-18 12:53:43 -070015#include "SkImageInfo.h"
16#include "SkTypes.h"
17
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040018#include <vector>
19
scroggo6f5e6192015-06-18 12:53:43 -070020class SkStream;
msarettff2a6c82016-09-07 11:23:28 -070021extern "C" {
22 struct WebPDemuxer;
23 void WebPDemuxDelete(WebPDemuxer* dmux);
24}
scroggo6f5e6192015-06-18 12:53:43 -070025
26class SkWebpCodec final : public SkCodec {
27public:
28 // Assumes IsWebp was called and returned true.
Mike Reedede7bac2017-07-23 15:30:02 -040029 static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
scroggodb30be22015-12-08 18:54:13 -080030 static bool IsWebp(const void*, size_t);
scroggo6f5e6192015-06-18 12:53:43 -070031protected:
Leon Scroggins571b30f2017-07-11 17:35:31 +000032 Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*) override;
Hal Canarydb683012016-11-23 08:55:18 -070033 SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kWEBP; }
scroggo6f5e6192015-06-18 12:53:43 -070034
scroggo6f5e6192015-06-18 12:53:43 -070035 SkISize onGetScaledDimensions(float desiredScale) const override;
scroggob636b452015-07-22 07:16:20 -070036
scroggoe7fc14b2015-10-02 13:14:46 -070037 bool onDimensionsSupported(const SkISize&) override;
38
scroggob636b452015-07-22 07:16:20 -070039 bool onGetValidSubset(SkIRect* /* desiredSubset */) const override;
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040040
41 int onGetFrameCount() override;
42 bool onGetFrameInfo(int, FrameInfo*) const override;
43 int onGetRepetitionCount() override;
44
Leon Scroggins III1f6af6b2017-06-12 16:41:09 -040045 const SkFrameHolder* getFrameHolder() const override {
46 return &fFrameHolder;
47 }
48
scroggo6f5e6192015-06-18 12:53:43 -070049private:
Mike Reedede7bac2017-07-23 15:30:02 -040050 SkWebpCodec(int width, int height, const SkEncodedInfo&, sk_sp<SkColorSpace>,
51 std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>);
msarettff2a6c82016-09-07 11:23:28 -070052
53 SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux;
54
55 // fDemux has a pointer into this data.
56 // This should not be freed until the decode is completed.
57 sk_sp<SkData> fData;
scroggo6f5e6192015-06-18 12:53:43 -070058
Leon Scroggins III557fbbe2017-05-23 09:37:21 -040059 class Frame : public SkFrame {
60 public:
61 Frame(int i, bool alpha)
62 : INHERITED(i)
63 , fReportsAlpha(alpha)
64 {}
65 Frame(Frame&& other)
66 : INHERITED(other.frameId())
67 , fReportsAlpha(other.fReportsAlpha)
68 {}
69
70 protected:
71 bool onReportsAlpha() const override {
72 return fReportsAlpha;
73 }
74
75 private:
76 const bool fReportsAlpha;
77
78 typedef SkFrame INHERITED;
79 };
80
81 class FrameHolder : public SkFrameHolder {
82 public:
83 ~FrameHolder() override {}
84 void setScreenSize(int w, int h) {
85 fScreenWidth = w;
86 fScreenHeight = h;
87 }
88 Frame* appendNewFrame(bool hasAlpha);
89 const Frame* frame(int i) const;
90 int size() const {
91 return static_cast<int>(fFrames.size());
92 }
93 void reserve(int size) {
94 fFrames.reserve(size);
95 }
96
97 protected:
98 const SkFrame* onGetFrame(int i) const override;
99
100 private:
101 std::vector<Frame> fFrames;
102 };
103
104 FrameHolder fFrameHolder;
105 // Set to true if WebPDemuxGetFrame fails. This only means
106 // that we will cap the frame count to the frames that
107 // succeed.
108 bool fFailed;
109
scroggo6f5e6192015-06-18 12:53:43 -0700110 typedef SkCodec INHERITED;
111};
112#endif // SkWebpCodec_DEFINED