| Index: src/codec/SkGifCodec.h
|
| diff --git a/src/codec/SkGifCodec.h b/src/codec/SkGifCodec.h
|
| index c56d3719a9e0733acf7d078e49ca889f48727323..8748df74a5bd9a3ef8a38bcb3bae7390d0ad265e 100644
|
| --- a/src/codec/SkGifCodec.h
|
| +++ b/src/codec/SkGifCodec.h
|
| @@ -6,10 +6,12 @@
|
| */
|
|
|
| #include "SkCodec.h"
|
| +#include "SkCodecAnimation.h"
|
| #include "SkColorSpace.h"
|
| #include "SkColorTable.h"
|
| #include "SkImageInfo.h"
|
| #include "SkSwizzler.h"
|
| +#include "../private/SkTArray.h"
|
|
|
| struct GifFileType;
|
| struct SavedImage;
|
| @@ -64,25 +66,16 @@ protected:
|
| return kGIF_SkEncodedFormat;
|
| }
|
|
|
| - bool onRewind() override;
|
| -
|
| uint64_t onGetFillValue(const SkImageInfo&) const override;
|
|
|
| - int onOutputScanline(int inputScanline) const override;
|
| + size_t onGetFrameCount() override {
|
| + return (size_t) fFrameInfos.count();
|
| + }
|
|
|
| -private:
|
| + size_t onGetRequiredFrame(size_t) override;
|
|
|
| - /*
|
| - * A gif can contain multiple image frames. We will only decode the first
|
| - * frame. This function reads up to the first image frame, processing
|
| - * transparency and/or animation information that comes before the image
|
| - * data.
|
| - *
|
| - * @param gif Pointer to the library type that manages the gif decode
|
| - * @param transIndex This call will set the transparent index based on the
|
| - * extension data.
|
| - */
|
| - static Result ReadUpToFirstImage(GifFileType* gif, uint32_t* transIndex);
|
| + size_t onGetFrameDuration(size_t) override;
|
| +private:
|
|
|
| /*
|
| * A gif may contain many image frames, all of different sizes.
|
| @@ -92,12 +85,10 @@ private:
|
| * @param gif Pointer to the library type that manages the gif decode
|
| * @param size Size of the image that we will decode.
|
| * Will be set by this function if the return value is true.
|
| - * @param frameRect Contains the dimenions and offset of the first image frame.
|
| - * Will be set by this function if the return value is true.
|
| *
|
| * @return true on success, false otherwise
|
| */
|
| - static bool GetDimensions(GifFileType* gif, SkISize* size, SkIRect* frameRect);
|
| + static bool GetDimensions(GifFileType* gif, SkISize* size);
|
|
|
| /*
|
| * Initializes the color table that we will use for decoding.
|
| @@ -122,49 +113,17 @@ private:
|
| int* inputColorCount, const Options& opts);
|
|
|
| /*
|
| - * Initializes the swizzler.
|
| - *
|
| - * @param dstInfo Output image information. Dimensions may have been
|
| - * adjusted if the image frame size does not match the size
|
| - * indicated in the header.
|
| - * @param options Informs the swizzler if destination memory is zero initialized.
|
| - * Contains subset information.
|
| - */
|
| - void initializeSwizzler(const SkImageInfo& dstInfo,
|
| - const Options& options);
|
| -
|
| - SkSampler* getSampler(bool createIfNecessary) override {
|
| - SkASSERT(fSwizzler);
|
| - return fSwizzler;
|
| - }
|
| -
|
| - /*
|
| - * @return true if the read is successful and false if the read fails.
|
| - */
|
| - bool readRow();
|
| -
|
| - Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& opts,
|
| - SkPMColor inputColorPtr[], int* inputColorCount) override;
|
| -
|
| - int onGetScanlines(void* dst, int count, size_t rowBytes) override;
|
| -
|
| - bool onSkipScanlines(int count) override;
|
| -
|
| - /*
|
| - * For a scanline decode of "count" lines, this function indicates how
|
| - * many of the "count" lines should be skipped until we reach the top of
|
| - * the image frame and how many of the "count" lines are actually inside
|
| - * the image frame.
|
| + * Recursive function to decode a frame.
|
| *
|
| - * @param count The number of scanlines requested.
|
| - * @param rowsBeforeFrame Output variable. The number of lines before
|
| - * we reach the top of the image frame.
|
| - * @param rowsInFrame Output variable. The number of lines to decode
|
| - * inside the image frame.
|
| + * If !opts.fHasPriorFrame, and the frame is not independent, it will first
|
| + * decode the frame that it depends on.
|
| */
|
| - void handleScanlineFrame(int count, int* rowsBeforeFrame, int* rowsInFrame);
|
| + void decodeFrame(const SkImageInfo& dstInfo, void* pixels, size_t dstRowBytes,
|
| + const Options& opts);
|
|
|
| - SkScanlineOrder onGetScanlineOrder() const override;
|
| + // FIXME: Old patch deletes this. Was that really necessary?
|
| + // void initializeSwizzler(const SkImageInfo& dstInfo,
|
| + // const Options& options);
|
|
|
| /*
|
| * This function cleans up the gif object after the decode completes
|
| @@ -190,16 +149,19 @@ private:
|
| * indicates that there is no transparent index.
|
| */
|
| SkGifCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
|
| - GifFileType* gif, uint32_t transIndex, const SkIRect& frameRect, bool frameIsSubset);
|
| + GifFileType* gif, uint32_t transIndex);
|
| +
|
| +
|
| + struct FrameInfo : public SkCodecAnimation::FrameInfo {
|
| + uint32_t fTransIndex;
|
| + };
|
|
|
| SkAutoTCallVProc<GifFileType, CloseGif> fGif; // owned
|
| SkAutoTDeleteArray<uint8_t> fSrcBuffer;
|
| - const SkIRect fFrameRect;
|
| - const uint32_t fTransIndex;
|
| uint32_t fFillIndex;
|
| - const bool fFrameIsSubset;
|
| SkAutoTDelete<SkSwizzler> fSwizzler;
|
| SkAutoTUnref<SkColorTable> fColorTable;
|
| + SkTArray<FrameInfo> fFrameInfos;
|
|
|
| typedef SkCodec INHERITED;
|
| };
|
|
|