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 15 typedef SkTRegistry<SkImageDecoder*, SkStream*> DecodeReg; 16 17 // N.B. You can't use "DecodeReg::gHead here" due to complex C++ 18 // corner cases. 19 template DecodeReg* SkTRegistry<SkImageDecoder*, SkStream*>::gHead; 20 21 #ifdef SK_ENABLE_LIBPNG 22 extern SkImageDecoder* sk_libpng_dfactory(SkStream*); 23 #endif 24 Factory(SkStream * stream)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 50 typedef SkTRegistry<SkMovie*, SkStream*> MovieReg; 51 DecodeStream(SkStream * stream)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