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/SkCodec.h" 12#include "include/core/SkEncodedImageFormat.h" 13#include "include/core/SkImageInfo.h" 14#include "include/core/SkTypes.h" 15#include "src/codec/SkFrameHolder.h" 16#include "src/codec/SkScalingCodec.h" 17 18#include <vector> 19 20class SkStream; 21extern "C" { 22 struct WebPDemuxer; 23 void WebPDemuxDelete(WebPDemuxer* dmux); 24} 25 26class SkWebpCodec final : public SkScalingCodec { 27public: 28 // Assumes IsWebp was called and returned true. 29 static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*); 30 static bool IsWebp(const void*, size_t); 31protected: 32 Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*) override; 33 SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kWEBP; } 34 35 bool onGetValidSubset(SkIRect* /* desiredSubset */) const override; 36 37 int onGetFrameCount() override; 38 bool onGetFrameInfo(int, FrameInfo*) const override; 39 int onGetRepetitionCount() override; 40 41 const SkFrameHolder* getFrameHolder() const override { 42 return &fFrameHolder; 43 } 44 45private: 46 SkWebpCodec(SkEncodedInfo&&, std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>, 47 SkEncodedOrigin); 48 49 SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux; 50 51 // fDemux has a pointer into this data. 52 // This should not be freed until the decode is completed. 53 sk_sp<SkData> fData; 54 55 class Frame : public SkFrame { 56 public: 57 Frame(int i, SkEncodedInfo::Alpha alpha) 58 : INHERITED(i) 59 , fReportedAlpha(alpha) 60 {} 61 62 protected: 63 SkEncodedInfo::Alpha onReportedAlpha() const override { 64 return fReportedAlpha; 65 } 66 67 private: 68 const SkEncodedInfo::Alpha fReportedAlpha; 69 70 using INHERITED = SkFrame; 71 }; 72 73 class FrameHolder : public SkFrameHolder { 74 public: 75 ~FrameHolder() override {} 76 void setScreenSize(int w, int h) { 77 fScreenWidth = w; 78 fScreenHeight = h; 79 } 80 Frame* appendNewFrame(bool hasAlpha); 81 const Frame* frame(int i) const; 82 int size() const { 83 return static_cast<int>(fFrames.size()); 84 } 85 void reserve(int size) { 86 fFrames.reserve(size); 87 } 88 89 protected: 90 const SkFrame* onGetFrame(int i) const override; 91 92 private: 93 std::vector<Frame> fFrames; 94 }; 95 96 FrameHolder fFrameHolder; 97 // Set to true if WebPDemuxGetFrame fails. This only means 98 // that we will cap the frame count to the frames that 99 // succeed. 100 bool fFailed; 101 102 using INHERITED = SkScalingCodec; 103}; 104#endif // SkWebpCodec_DEFINED 105