1 2/* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "SkImageDecoder.h" 11#include "SkMovie.h" 12#include "SkStream.h" 13#include "SkTRegistry.h" 14 15typedef SkTRegistry<SkImageDecoder*, SkStream*> DecodeReg; 16 17// N.B. You can't use "DecodeReg::gHead here" due to complex C++ 18// corner cases. 19template DecodeReg* SkTRegistry<SkImageDecoder*, SkStream*>::gHead; 20 21#ifdef SK_ENABLE_LIBPNG 22 extern SkImageDecoder* sk_libpng_dfactory(SkStream*); 23#endif 24 25SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) { 26 SkImageDecoder* codec = NULL; 27 const DecodeReg* curr = DecodeReg::Head(); 28 while (curr) { 29 codec = curr->factory()(stream); 30 // we rewind here, because we promise later when we call "decode", that 31 // the stream will be at its beginning. 32 stream->rewind(); 33 if (codec) { 34 return codec; 35 } 36 curr = curr->next(); 37 } 38#ifdef SK_ENABLE_LIBPNG 39 codec = sk_libpng_dfactory(stream); 40 stream->rewind(); 41 if (codec) { 42 return codec; 43 } 44#endif 45 return NULL; 46} 47 48///////////////////////////////////////////////////////////////////////// 49 50typedef SkTRegistry<SkMovie*, SkStream*> MovieReg; 51 52SkMovie* SkMovie::DecodeStream(SkStream* stream) { 53 const MovieReg* curr = MovieReg::Head(); 54 while (curr) { 55 SkMovie* movie = curr->factory()(stream); 56 if (movie) { 57 return movie; 58 } 59 // we must rewind only if we got NULL, since we gave the stream to the 60 // movie, who may have already started reading from it 61 stream->rewind(); 62 curr = curr->next(); 63 } 64 return NULL; 65} 66