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