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