Chromium Code Reviews| Index: include/codec/SkCodec.h |
| diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h |
| index 363347dd72c08f0e05f97433bf9a5da473df05ea..b991ecab3aada96c94afab94ed294430b7bf6e48 100644 |
| --- a/include/codec/SkCodec.h |
| +++ b/include/codec/SkCodec.h |
| @@ -18,6 +18,8 @@ |
| #include "SkTypes.h" |
| #include "SkYUVSizeInfo.h" |
| +#include <vector> |
| + |
| class SkColorSpace; |
| class SkData; |
| class SkPngChunkReader; |
| @@ -220,6 +222,38 @@ public: |
| }; |
| /** |
| + * Additional options that only apply to multiframe images. |
| + */ |
| + struct MultiFrameOptions { |
| + MultiFrameOptions() |
| + : fIndex(0) |
| + , fHasPriorFrame(false) |
| + {} |
| + |
| + /** |
| + * The frame to decode. |
| + */ |
| + size_t fIndex; |
| + |
| + /** |
| + * If true, the dst already contains the prior frame. |
| + * |
| + * If fIndex needs to be blended with a prior frame (as reported by |
| + * getRequiredFrame(fIndex)), the client can set this to either |
| + * true or false: |
| + * |
| + * true means that the prior frame is already in the dst, and this |
| + * codec only needs to decode fIndex and blend it with the dst. |
| + * Options.fZeroInitialized is ignored in this case. |
| + * |
| + * false means that the dst does not contain the prior frame, so this |
| + * codec needs to first decode the prior frame (which in turn may need |
| + * to decode its prior frame). |
| + */ |
| + bool fHasPriorFrame; |
| + }; |
| + |
| + /** |
| * Whether or not the memory passed to getPixels is zero initialized. |
| */ |
| enum ZeroInitialized { |
| @@ -243,10 +277,11 @@ public: |
| struct Options { |
| Options() |
| : fZeroInitialized(kNo_ZeroInitialized) |
| - , fSubset(NULL) |
| + , fSubset(nullptr) |
| + , fFrameOptions(nullptr) |
| {} |
| - ZeroInitialized fZeroInitialized; |
| + ZeroInitialized fZeroInitialized; |
| /** |
| * If not NULL, represents a subset of the original image to decode. |
| * Must be within the bounds returned by getInfo(). |
| @@ -264,7 +299,14 @@ public: |
| * subset left and subset width to decode partial scanlines on calls |
| * to getScanlines(). |
| */ |
| - SkIRect* fSubset; |
| + SkIRect* fSubset; |
| + |
| + /** |
| + * Options that are only relevant for multi-frame images. |
| + * |
| + * Unowned pointer. |
| + */ |
| + MultiFrameOptions* fFrameOptions; |
| }; |
| /** |
| @@ -566,6 +608,40 @@ public: |
| */ |
| int outputScanline(int inputScanline) const; |
| + // The required frame for an independent frame is marked as |
| + // kIndependentFrame. |
| + static constexpr size_t kIndependentFrame = static_cast<size_t>(-1); |
| + |
| + /** |
| + * Information about individual frames in a multi-framed image. |
| + */ |
| + struct FrameInfo { |
|
scroggo
2016/09/26 15:51:43
I also considered "FrameMetaData". Any preference
msarett
2016/09/26 17:30:53
I prefer FrameInfo, but don't feel strongly.
|
| + /** |
| + * The frame that this frame needs to be blended with, or |
| + * kIndependentFrame. |
| + */ |
| + size_t fRequiredFrame; |
| + |
| + /** |
| + * Number of 1/100 seconds to show this frame. |
|
msarett
2016/09/26 17:30:53
I'm guessing "1/100 seconds" is what Chrome does?
scroggo
2016/09/26 17:43:11
D'oh - good catch. I just used 1/100 seconds becau
|
| + */ |
| + size_t fDuration; |
| + }; |
| + |
| + /** |
| + * Return info about the frames in the image. |
| + * |
| + * May require reading through the stream to determine the number of |
| + * frames. |
| + * |
| + * As such, future decoding calls may require a rewind. |
| + * |
| + * For single-frame images, this will return an empty vector. |
| + */ |
| + std::vector<FrameInfo> getFrameInfo() { |
| + return this->onGetFrameInfo(); |
| + } |
| + |
| protected: |
| /** |
| * Takes ownership of SkStream* |
| @@ -706,6 +782,11 @@ protected: |
| virtual int onOutputScanline(int inputScanline) const; |
| + virtual std::vector<FrameInfo> onGetFrameInfo() { |
| + // empty vector - this is not animated. |
| + return {}; |
| + } |
| + |
| /** |
| * Used for testing with qcms. |
| * FIXME: Remove this when we are done comparing with qcms. |