SkCodec_libgif.h revision 8c8f22a3bba18edaad41d6ac8451a77aa093a958
18c8f22a3bba18edaad41d6ac8451a77aa093a958msarett/*
28c8f22a3bba18edaad41d6ac8451a77aa093a958msarett * Copyright 2015 Google Inc.
38c8f22a3bba18edaad41d6ac8451a77aa093a958msarett *
48c8f22a3bba18edaad41d6ac8451a77aa093a958msarett * Use of this source code is governed by a BSD-style license that can be
58c8f22a3bba18edaad41d6ac8451a77aa093a958msarett * found in the LICENSE file.
68c8f22a3bba18edaad41d6ac8451a77aa093a958msarett */
78c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
88c8f22a3bba18edaad41d6ac8451a77aa093a958msarett#include "SkCodec.h"
98c8f22a3bba18edaad41d6ac8451a77aa093a958msarett#include "SkImageInfo.h"
108c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
118c8f22a3bba18edaad41d6ac8451a77aa093a958msarett#include "gif_lib.h"
128c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
138c8f22a3bba18edaad41d6ac8451a77aa093a958msarett/*
148c8f22a3bba18edaad41d6ac8451a77aa093a958msarett *
158c8f22a3bba18edaad41d6ac8451a77aa093a958msarett * This class implements the decoding for gif images
168c8f22a3bba18edaad41d6ac8451a77aa093a958msarett *
178c8f22a3bba18edaad41d6ac8451a77aa093a958msarett */
188c8f22a3bba18edaad41d6ac8451a77aa093a958msarettclass SkGifCodec : public SkCodec {
198c8f22a3bba18edaad41d6ac8451a77aa093a958msarettpublic:
208c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
218c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    /*
228c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Checks the start of the stream to see if the image is a gif
238c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     */
248c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    static bool IsGif(SkStream*);
258c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
268c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    /*
278c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Assumes IsGif was called and returned true
288c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Creates a gif decoder
298c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Reads enough of the stream to determine the image format
308c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     */
318c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    static SkCodec* NewFromStream(SkStream*);
328c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
338c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
348c8f22a3bba18edaad41d6ac8451a77aa093a958msarettprotected:
358c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
368c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    /*
378c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Initiates the gif decode
388c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     */
398c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&,
408c8f22a3bba18edaad41d6ac8451a77aa093a958msarett            SkPMColor*, int32_t*) override;
418c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
428c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    SkEncodedFormat onGetEncodedFormat() const override {
438c8f22a3bba18edaad41d6ac8451a77aa093a958msarett        return kGIF_SkEncodedFormat;
448c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    }
458c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
468c8f22a3bba18edaad41d6ac8451a77aa093a958msarettprivate:
478c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
488c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    /*
498c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * This function cleans up the gif object after the decode completes
508c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * It is used in a SkAutoTCallIProc template
518c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     */
528c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    static int32_t CloseGif(GifFileType* gif);
538c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
548c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    /*
558c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Frees any extension data used in the decode
568c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Used in a SkAutoTCallVProc
578c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     */
588c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    static void FreeExtension(SavedImage* image);
598c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
608c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    /*
618c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Creates an instance of the decoder
628c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * Called only by NewFromStream
638c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     *
648c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * @param srcInfo contains the source width and height
658c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * @param stream the stream of image data
668c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     * @param gif pointer to library type that manages gif decode
678c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     *            takes ownership
688c8f22a3bba18edaad41d6ac8451a77aa093a958msarett     */
698c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    SkGifCodec(const SkImageInfo& srcInfo, SkStream* stream, GifFileType* gif);
708c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
718c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    SkAutoTCallIProc<GifFileType, CloseGif> fGif; // owned
728c8f22a3bba18edaad41d6ac8451a77aa093a958msarett
738c8f22a3bba18edaad41d6ac8451a77aa093a958msarett    typedef SkCodec INHERITED;
748c8f22a3bba18edaad41d6ac8451a77aa093a958msarett};
75