1 2 /* 3 * Copyright 2011 Google Inc. 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 #include "SkMovie.h" 9 #include "SkCanvas.h" 10 #include "SkPaint.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 sentinal. 14 #define UNINITIALIZED_MSEC ((SkMSec)-1) 15 SkMovie()16SkMovie::SkMovie() 17 { 18 fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized 19 fCurrTime = UNINITIALIZED_MSEC; // uninitialized 20 fNeedBitmap = true; 21 } 22 ensureInfo()23void SkMovie::ensureInfo() 24 { 25 if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) 26 memset(&fInfo, 0, sizeof(fInfo)); // failure 27 } 28 duration()29SkMSec SkMovie::duration() 30 { 31 this->ensureInfo(); 32 return fInfo.fDuration; 33 } 34 width()35int SkMovie::width() 36 { 37 this->ensureInfo(); 38 return fInfo.fWidth; 39 } 40 height()41int SkMovie::height() 42 { 43 this->ensureInfo(); 44 return fInfo.fHeight; 45 } 46 isOpaque()47int SkMovie::isOpaque() 48 { 49 this->ensureInfo(); 50 return fInfo.fIsOpaque; 51 } 52 setTime(SkMSec time)53bool SkMovie::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& SkMovie::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 85 #include "SkStream.h" 86 DecodeMemory(const void * data,size_t length)87SkMovie* SkMovie::DecodeMemory(const void* data, size_t length) { 88 SkMemoryStream stream(data, length, false); 89 return SkMovie::DecodeStream(&stream); 90 } 91 DecodeFile(const char path[])92SkMovie* SkMovie::DecodeFile(const char path[]) { 93 SkAutoTDelete<SkStreamRewindable> stream(SkStream::NewFromFile(path)); 94 return stream.get() ? SkMovie::DecodeStream(stream) : nullptr; 95 } 96