1 
2 /*
3  * Copyright 2008 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 #ifndef Movie_DEFINED
11 #define Movie_DEFINED
12 
13 #include "SkBitmap.h"
14 #include "SkCanvas.h"
15 #include "SkRefCnt.h"
16 
17 class SkStreamRewindable;
18 
19 class Movie : public SkRefCnt {
20 public:
21     /** Try to create a movie from the stream. If the stream format is not
22         supported, return NULL.
23     */
24     static Movie* DecodeStream(SkStreamRewindable*);
25     /** Try to create a movie from the specified file path. If the file is not
26         found, or the format is not supported, return NULL. If a movie is
27         returned, the stream may be retained by the movie (via ref()) until
28         the movie is finished with it (by calling unref()).
29     */
30     static Movie* DecodeFile(const char path[]);
31     /** Try to create a movie from the specified memory.
32         If the format is not supported, return NULL. If a movie is returned,
33         the data will have been read or copied, and so the caller may free
34         it.
35     */
36     static Movie* DecodeMemory(const void* data, size_t length);
37 
38     SkMSec  duration();
39     int     width();
40     int     height();
41     int     isOpaque();
42 
43     /** Specify the time code (between 0...duration) to sample a bitmap
44         from the movie. Returns true if this time code generated a different
45         bitmap/frame from the previous state (i.e. true means you need to
46         redraw).
47     */
48     bool setTime(SkMSec);
49 
50     // return the right bitmap for the current time code
51     const SkBitmap& bitmap();
52 
53 protected:
54     struct Info {
55         SkMSec  fDuration;
56         int     fWidth;
57         int     fHeight;
58         bool    fIsOpaque;
59     };
60 
61     virtual bool onGetInfo(Info*) = 0;
62     virtual bool onSetTime(SkMSec) = 0;
63     virtual bool onGetBitmap(SkBitmap*) = 0;
64 
65     // visible for subclasses
66     Movie();
67 
68 private:
69     Info        fInfo;
70     SkMSec      fCurrTime;
71     SkBitmap    fBitmap;
72     bool        fNeedBitmap;
73 
74     void ensureInfo();
75 
76     typedef SkRefCnt INHERITED;
77 };
78 
79 #endif
80