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