| /* | 
 |  * Copyright 2011 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 | #include "Movie.h" | 
 | #include "SkBitmap.h" | 
 | #include "SkStream.h" | 
 | #include "SkTypes.h" | 
 |  | 
 | // We should never see this in normal operation since our time values are | 
 | // 0-based. So we use it as a sentinel. | 
 | #define UNINITIALIZED_MSEC ((SkMSec)-1) | 
 |  | 
 | Movie::Movie() | 
 | { | 
 |     fInfo.fDuration = UNINITIALIZED_MSEC;  // uninitialized | 
 |     fCurrTime = UNINITIALIZED_MSEC; // uninitialized | 
 |     fNeedBitmap = true; | 
 | } | 
 |  | 
 | void Movie::ensureInfo() | 
 | { | 
 |     if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo)) | 
 |         memset(&fInfo, 0, sizeof(fInfo));   // failure | 
 | } | 
 |  | 
 | SkMSec Movie::duration() | 
 | { | 
 |     this->ensureInfo(); | 
 |     return fInfo.fDuration; | 
 | } | 
 |  | 
 | int Movie::width() | 
 | { | 
 |     this->ensureInfo(); | 
 |     return fInfo.fWidth; | 
 | } | 
 |  | 
 | int Movie::height() | 
 | { | 
 |     this->ensureInfo(); | 
 |     return fInfo.fHeight; | 
 | } | 
 |  | 
 | int Movie::isOpaque() | 
 | { | 
 |     this->ensureInfo(); | 
 |     return fInfo.fIsOpaque; | 
 | } | 
 |  | 
 | bool Movie::setTime(SkMSec time) | 
 | { | 
 |     SkMSec dur = this->duration(); | 
 |     if (time > dur) | 
 |         time = dur; | 
 |  | 
 |     bool changed = false; | 
 |     if (time != fCurrTime) | 
 |     { | 
 |         fCurrTime = time; | 
 |         changed = this->onSetTime(time); | 
 |         fNeedBitmap |= changed; | 
 |     } | 
 |     return changed; | 
 | } | 
 |  | 
 | const SkBitmap& Movie::bitmap() | 
 | { | 
 |     if (fCurrTime == UNINITIALIZED_MSEC)    // uninitialized | 
 |         this->setTime(0); | 
 |  | 
 |     if (fNeedBitmap) | 
 |     { | 
 |         if (!this->onGetBitmap(&fBitmap))   // failure | 
 |             fBitmap.reset(); | 
 |         fNeedBitmap = false; | 
 |     } | 
 |     return fBitmap; | 
 | } | 
 |  | 
 | //////////////////////////////////////////////////////////////////// | 
 |  | 
 | Movie* Movie::DecodeMemory(const void* data, size_t length) { | 
 |     SkMemoryStream stream(data, length, false); | 
 |     return Movie::DecodeStream(&stream); | 
 | } | 
 |  | 
 | Movie* Movie::DecodeFile(const char path[]) { | 
 |     std::unique_ptr<SkStreamRewindable> stream = SkStream::MakeFromFile(path); | 
 |     return stream ? Movie::DecodeStream(stream.get()) : nullptr; | 
 | } |