1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMovie.h" 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// We should never see this in normal operation since our time values are 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// 0-based. So we use it as a sentinal. 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define UNINITIALIZED_MSEC ((SkMSec)-1) 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMovie::SkMovie() 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCurrTime = UNINITIALIZED_MSEC; // uninitialized 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fNeedBitmap = true; 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkMovie::ensureInfo() 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memset(&fInfo, 0, sizeof(fInfo)); // failure 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMSec SkMovie::duration() 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->ensureInfo(); 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fInfo.fDuration; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkMovie::width() 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->ensureInfo(); 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fInfo.fWidth; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkMovie::height() 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->ensureInfo(); 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fInfo.fHeight; 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkMovie::isOpaque() 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->ensureInfo(); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fInfo.fIsOpaque; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkMovie::setTime(SkMSec time) 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMSec dur = this->duration(); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (time > dur) 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com time = dur; 58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool changed = false; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (time != fCurrTime) 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCurrTime = time; 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com changed = this->onSetTime(time); 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fNeedBitmap |= changed; 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return changed; 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkBitmap& SkMovie::bitmap() 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fCurrTime == UNINITIALIZED_MSEC) // uninitialized 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->setTime(0); 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fNeedBitmap) 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!this->onGetBitmap(&fBitmap)) // failure 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fBitmap.reset(); 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fNeedBitmap = false; 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fBitmap; 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////// 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h" 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMovie* SkMovie::DecodeMemory(const void* data, size_t length) { 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMemoryStream stream(data, length, false); 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return SkMovie::DecodeStream(&stream); 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 92f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.orgSkMovie* SkMovie::DecodeFile(const char path[]) { 93b5571b3324cf18629a255ec85e189447069c9b14scroggo@google.com SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path)); 94f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org return stream.get() ? SkMovie::DecodeStream(stream) : NULL; 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 96