11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2008 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkMovie_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkMovie_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkStream;
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkMovie : public SkRefCnt {
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Try to create a movie from the stream. If the stream format is not
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        supported, return NULL.
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkMovie* DecodeStream(SkStream*);
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Try to create a movie from the specified file path. If the file is not
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        found, or the format is not supported, return NULL. If a movie is
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returned, the stream may be retained by the movie (via ref()) until
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the movie is finished with it (by calling unref()).
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkMovie* DecodeFile(const char path[]);
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Try to create a movie from the specified memory.
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        If the format is not supported, return NULL. If a movie is returned,
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the data will have been read or copied, and so the caller may free
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        it.
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkMovie* DecodeMemory(const void* data, size_t length);
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMSec  duration();
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     width();
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     height();
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     isOpaque();
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Specify the time code (between 0...duration) to sample a bitmap
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        from the movie. Returns true if this time code generated a different
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap/frame from the previous state (i.e. true means you need to
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        redraw).
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool setTime(SkMSec);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // return the right bitmap for the current time code
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkBitmap& bitmap();
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    struct Info {
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkMSec  fDuration;
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int     fWidth;
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int     fHeight;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bool    fIsOpaque;
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool onGetInfo(Info*) = 0;
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool onSetTime(SkMSec) = 0;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool onGetBitmap(SkBitmap*) = 0;
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // visible for subclasses
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMovie();
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Info        fInfo;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMSec      fCurrTime;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBitmap    fBitmap;
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool        fNeedBitmap;
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void ensureInfo();
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
77