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