17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2006 The Android Open Source Project
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkImageDecoder.h"
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkMovie.h"
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkStream.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerextern SkImageDecoder* image_decoder_from_stream(SkStreamRewindable*);
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
150a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerSkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) {
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return image_decoder_from_stream(stream);
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/////////////////////////////////////////////////////////////////////////
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergertypedef SkTRegistry<SkMovie*(*)(SkStreamRewindable*)> MovieReg;
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
230a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerSkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) {
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const MovieReg* curr = MovieReg::Head();
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    while (curr) {
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMovie* movie = curr->factory()(stream);
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (movie) {
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return movie;
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // we must rewind only if we got NULL, since we gave the stream to the
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // movie, who may have already started reading from it
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        stream->rewind();
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        curr = curr->next();
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return NULL;
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
37