SkMovie.cpp revision 0a657bbc2c6fc9daf699942e023050536d5ec95f
180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMovie.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_DEFINE_INST_COUNT(SkMovie) 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// We should never see this in normal operation since our time values are 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// 0-based. So we use it as a sentinal. 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define UNINITIALIZED_MSEC ((SkMSec)-1) 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMovie::SkMovie() 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fCurrTime = UNINITIALIZED_MSEC; // uninitialized 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fNeedBitmap = true; 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkMovie::ensureInfo() 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru memset(&fInfo, 0, sizeof(fInfo)); // failure 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMSec SkMovie::duration() 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fDuration; 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::width() 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fWidth; 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::height() 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fHeight; 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::isOpaque() 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fIsOpaque; 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkMovie::setTime(SkMSec time) 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMSec dur = this->duration(); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (time > dur) 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru time = dur; 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool changed = false; 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (time != fCurrTime) 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fCurrTime = time; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru changed = this->onSetTime(time); 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fNeedBitmap |= changed; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return changed; 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkBitmap& SkMovie::bitmap() 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fCurrTime == UNINITIALIZED_MSEC) // uninitialized 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->setTime(0); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fNeedBitmap) 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!this->onGetBitmap(&fBitmap)) // failure 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBitmap.reset(); 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fNeedBitmap = false; 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fBitmap; 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//////////////////////////////////////////////////////////////////// 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h" 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMovie* SkMovie::DecodeMemory(const void* data, size_t length) { 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMemoryStream stream(data, length, false); 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkMovie::DecodeStream(&stream); 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 94096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerSkMovie* SkMovie::DecodeFile(const char path[]) { 950a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path)); 96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return stream.get() ? SkMovie::DecodeStream(stream) : NULL; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 98