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