1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #include "Movie.h" 8 #include "SkBitmap.h" 9 #include "SkStream.h" 10 #include "SkTypes.h" 11 12 // We should never see this in normal operation since our time values are 13 // 0-based. So we use it as a sentinel. 14 #define UNINITIALIZED_MSEC ((SkMSec)-1) 15 Movie()16Movie::Movie() 17 { 18 fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized 19 fCurrTime = UNINITIALIZED_MSEC; // uninitialized 20 fNeedBitmap = true; 21 } 22 ensureInfo()23void Movie::ensureInfo() 24 { 25 if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) 26 memset(&fInfo, 0, sizeof(fInfo)); // failure 27 } 28 duration()29SkMSec Movie::duration() 30 { 31 this->ensureInfo(); 32 return fInfo.fDuration; 33 } 34 width()35int Movie::width() 36 { 37 this->ensureInfo(); 38 return fInfo.fWidth; 39 } 40 height()41int Movie::height() 42 { 43 this->ensureInfo(); 44 return fInfo.fHeight; 45 } 46 isOpaque()47int Movie::isOpaque() 48 { 49 this->ensureInfo(); 50 return fInfo.fIsOpaque; 51 } 52 setTime(SkMSec time)53bool Movie::setTime(SkMSec time) 54 { 55 SkMSec dur = this->duration(); 56 if (time > dur) 57 time = dur; 58 59 bool changed = false; 60 if (time != fCurrTime) 61 { 62 fCurrTime = time; 63 changed = this->onSetTime(time); 64 fNeedBitmap |= changed; 65 } 66 return changed; 67 } 68 bitmap()69const SkBitmap& Movie::bitmap() 70 { 71 if (fCurrTime == UNINITIALIZED_MSEC) // uninitialized 72 this->setTime(0); 73 74 if (fNeedBitmap) 75 { 76 if (!this->onGetBitmap(&fBitmap)) // failure 77 fBitmap.reset(); 78 fNeedBitmap = false; 79 } 80 return fBitmap; 81 } 82 83 //////////////////////////////////////////////////////////////////// 84 DecodeMemory(const void * data,size_t length)85Movie* Movie::DecodeMemory(const void* data, size_t length) { 86 SkMemoryStream stream(data, length, false); 87 return Movie::DecodeStream(&stream); 88 } 89 DecodeFile(const char path[])90Movie* Movie::DecodeFile(const char path[]) { 91 std::unique_ptr<SkStreamRewindable> stream = SkStream::MakeFromFile(path); 92 return stream ? Movie::DecodeStream(stream.get()) : nullptr; 93 } 94