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 Queru// We should never see this in normal operation since our time values are 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// 0-based. So we use it as a sentinal. 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define UNINITIALIZED_MSEC ((SkMSec)-1) 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMovie::SkMovie() 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fCurrTime = UNINITIALIZED_MSEC; // uninitialized 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fNeedBitmap = true; 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkMovie::ensureInfo() 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru memset(&fInfo, 0, sizeof(fInfo)); // failure 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMSec SkMovie::duration() 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fDuration; 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::width() 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fWidth; 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::height() 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fHeight; 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::isOpaque() 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->ensureInfo(); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fInfo.fIsOpaque; 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkMovie::setTime(SkMSec time) 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMSec dur = this->duration(); 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (time > dur) 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru time = dur; 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool changed = false; 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (time != fCurrTime) 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fCurrTime = time; 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru changed = this->onSetTime(time); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fNeedBitmap |= changed; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return changed; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkBitmap& SkMovie::bitmap() 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fCurrTime == UNINITIALIZED_MSEC) // uninitialized 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->setTime(0); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fNeedBitmap) 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!this->onGetBitmap(&fBitmap)) // failure 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBitmap.reset(); 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fNeedBitmap = false; 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fBitmap; 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//////////////////////////////////////////////////////////////////// 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h" 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMovie* SkMovie::DecodeMemory(const void* data, size_t length) { 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMemoryStream stream(data, length, false); 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkMovie::DecodeStream(&stream); 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 92096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerSkMovie* SkMovie::DecodeFile(const char path[]) { 930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path)); 94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return stream.get() ? SkMovie::DecodeStream(stream) : NULL; 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 96