blob: f3cb120a477f822426a5ea63958085e88679ee8e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#include "SkImageDecoder.h"
11#include "SkMovie.h"
12#include "SkStream.h"
reed@android.com00bf85a2009-01-22 13:04:56 +000013#include "SkTRegistry.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000014
reed@android.com00bf85a2009-01-22 13:04:56 +000015typedef SkTRegistry<SkImageDecoder*, SkStream*> DecodeReg;
reed@android.com8a1c16f2008-12-17 15:59:43 +000016
agl@chromium.org4f9cdcc2010-06-10 21:32:00 +000017// N.B. You can't use "DecodeReg::gHead here" due to complex C++
18// corner cases.
19template DecodeReg* SkTRegistry<SkImageDecoder*, SkStream*>::gHead;
reed@android.com3c2b7e82009-01-27 01:43:36 +000020
reed@android.comdfee5792010-04-15 14:24:50 +000021#ifdef SK_ENABLE_LIBPNG
22 extern SkImageDecoder* sk_libpng_dfactory(SkStream*);
23#endif
24
reed@android.com8a1c16f2008-12-17 15:59:43 +000025SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) {
reed@android.comdfee5792010-04-15 14:24:50 +000026 SkImageDecoder* codec = NULL;
reed@android.com00bf85a2009-01-22 13:04:56 +000027 const DecodeReg* curr = DecodeReg::Head();
28 while (curr) {
reed@android.comdfee5792010-04-15 14:24:50 +000029 codec = curr->factory()(stream);
reed@android.coma16cb972009-06-18 20:26:58 +000030 // we rewind here, because we promise later when we call "decode", that
31 // the stream will be at its beginning.
reed@android.com8a1c16f2008-12-17 15:59:43 +000032 stream->rewind();
reed@android.com00bf85a2009-01-22 13:04:56 +000033 if (codec) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000034 return codec;
35 }
reed@android.com00bf85a2009-01-22 13:04:56 +000036 curr = curr->next();
reed@android.com8a1c16f2008-12-17 15:59:43 +000037 }
reed@android.comdfee5792010-04-15 14:24:50 +000038#ifdef SK_ENABLE_LIBPNG
39 codec = sk_libpng_dfactory(stream);
40 stream->rewind();
41 if (codec) {
42 return codec;
43 }
44#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000045 return NULL;
46}
47
reed@android.com8a1c16f2008-12-17 15:59:43 +000048/////////////////////////////////////////////////////////////////////////
49
reed@android.com00bf85a2009-01-22 13:04:56 +000050typedef SkTRegistry<SkMovie*, SkStream*> MovieReg;
reed@android.com8a1c16f2008-12-17 15:59:43 +000051
52SkMovie* SkMovie::DecodeStream(SkStream* stream) {
reed@android.com00bf85a2009-01-22 13:04:56 +000053 const MovieReg* curr = MovieReg::Head();
54 while (curr) {
55 SkMovie* movie = curr->factory()(stream);
56 if (movie) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000057 return movie;
58 }
reed@android.coma16cb972009-06-18 20:26:58 +000059 // 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
reed@android.com8a1c16f2008-12-17 15:59:43 +000061 stream->rewind();
reed@android.com00bf85a2009-01-22 13:04:56 +000062 curr = curr->next();
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 }
64 return NULL;
65}