• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 SkCodecImageGenerator_DEFINED
8 #define SkCodecImageGenerator_DEFINED
9 
10 #include "include/codec/SkCodec.h"
11 #include "include/core/SkData.h"
12 #include "include/core/SkImageGenerator.h"
13 
14 class SkCodecImageGenerator : public SkImageGenerator {
15 public:
16     /*
17      * If this data represents an encoded image that we know how to decode,
18      * return an SkCodecImageGenerator.  Otherwise return nullptr.
19      */
20     static std::unique_ptr<SkImageGenerator> MakeFromEncodedCodec(sk_sp<SkData>);
21 
22     static std::unique_ptr<SkImageGenerator> MakeFromCodec(std::unique_ptr<SkCodec>);
23 
24     /**
25      * Return a size that approximately supports the desired scale factor. The codec may not be able
26      * to scale efficiently to the exact scale factor requested, so return a size that approximates
27      * that scale. The returned value is the codec's suggestion for the closest valid scale that it
28      * can natively support.
29      *
30      * This is similar to SkCodec::getScaledDimensions, but adjusts the returned dimensions based
31      * on the image's EXIF orientation.
32      */
33     SkISize getScaledDimensions(float desiredScale) const;
34 
35     /**
36      *  Decode into the given pixels, a block of memory of size at
37      *  least (info.fHeight - 1) * rowBytes + (info.fWidth *
38      *  bytesPerPixel)
39      *
40      *  Repeated calls to this function should give the same results,
41      *  allowing the PixelRef to be immutable.
42      *
43      *  @param info A description of the format
44      *         expected by the caller.  This can simply be identical
45      *         to the info returned by getInfo().
46      *
47      *         This contract also allows the caller to specify
48      *         different output-configs, which the implementation can
49      *         decide to support or not.
50      *
51      *         A size that does not match getInfo() implies a request
52      *         to scale. If the generator cannot perform this scale,
53      *         it will return false.
54      *
55      *  @return true on success.
56      */
57     bool getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const SkCodec::Options* options = nullptr);
58 
59     /**
60      *  Return the number of frames in the image.
61      *
62      *  May require reading through the stream.
63      */
getFrameCount()64     int getFrameCount() { return fCodec->getFrameCount(); }
65 
66     /**
67      *  Return info about a single frame.
68      *
69      *  Only supported by multi-frame images. Does not read through the stream,
70      *  so it should be called after getFrameCount() to parse any frames that
71      *  have not already been parsed.
72      */
getFrameInfo(int index,SkCodec::FrameInfo * info)73     bool getFrameInfo(int index, SkCodec::FrameInfo* info) const {
74         return fCodec->getFrameInfo(index, info);
75     }
76 
77     /**
78      *  Return the number of times to repeat, if this image is animated. This number does not
79      *  include the first play through of each frame. For example, a repetition count of 4 means
80      *  that each frame is played 5 times and then the animation stops.
81      *
82      *  It can return kRepetitionCountInfinite, a negative number, meaning that the animation
83      *  should loop forever.
84      *
85      *  May require reading the stream to find the repetition count.
86      *
87      *  As such, future decoding calls may require a rewind.
88      *
89      *  For still (non-animated) image codecs, this will return 0.
90      */
getRepetitionCount()91     int getRepetitionCount() { return fCodec->getRepetitionCount(); }
92 
93 protected:
94     sk_sp<SkData> onRefEncodedData() override;
95 
96     bool onGetPixels(const SkImageInfo& info,
97                      void* pixels,
98                      size_t rowBytes,
99                      const Options& opts) override;
100 
101     bool onQueryYUVAInfo(const SkYUVAPixmapInfo::SupportedDataTypes&,
102                          SkYUVAPixmapInfo*) const override;
103 
104     bool onGetYUVAPlanes(const SkYUVAPixmaps& yuvaPixmaps) override;
105 
106 private:
107     /*
108      * Takes ownership of codec
109      */
110     SkCodecImageGenerator(std::unique_ptr<SkCodec>, sk_sp<SkData>);
111 
112     std::unique_ptr<SkCodec> fCodec;
113     sk_sp<SkData> fData;
114 
115     using INHERITED = SkImageGenerator;
116 };
117 #endif  // SkCodecImageGenerator_DEFINED
118