SkWebpCodec.h 2.8 KB

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