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