Home | History | Annotate | Download | only in images
      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 
     25 SkImageDecoder* 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 
     52 SkMovie* 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