19759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
29759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com/*
39759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com * Copyright 2006 The Android Open Source Project
49759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com *
59759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com * Use of this source code is governed by a BSD-style license that can be
69759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com * found in the LICENSE file.
79759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com */
89759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
99759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com#include "SkImageDecoder.h"
109759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com#include "SkMovie.h"
119759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com#include "SkStream.h"
129759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
13fcf1894d3100d37865bdda5b5bbf67f09e082077scroggo@google.comextern SkImageDecoder* image_decoder_from_stream(SkStreamRewindable*);
149759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
15fcf1894d3100d37865bdda5b5bbf67f09e082077scroggo@google.comSkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) {
169759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com    return image_decoder_from_stream(stream);
179759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com}
189759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
199759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com/////////////////////////////////////////////////////////////////////////
209759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
21fcf1894d3100d37865bdda5b5bbf67f09e082077scroggo@google.comtypedef SkTRegistry<SkMovie*(*)(SkStreamRewindable*)> MovieReg;
229759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com
23fcf1894d3100d37865bdda5b5bbf67f09e082077scroggo@google.comSkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) {
249759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com    const MovieReg* curr = MovieReg::Head();
259759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com    while (curr) {
269759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        SkMovie* movie = curr->factory()(stream);
279759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        if (movie) {
289759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com            return movie;
299759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        }
309759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        // we must rewind only if we got NULL, since we gave the stream to the
319759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        // movie, who may have already started reading from it
329759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        stream->rewind();
339759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com        curr = curr->next();
349759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com    }
359759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com    return NULL;
369759beb59fc6bb942229f2ace8980ca52dbf25f4scroggo@google.com}
37