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