blob: 2a1339f36e558798e46e907bc2d8c2f4e24709fd [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SkMovie.h"
9#include "SkCanvas.h"
10#include "SkPaint.h"
11
reed@android.com8a1c16f2008-12-17 15:59:43 +000012// We should never see this in normal operation since our time values are
13// 0-based. So we use it as a sentinal.
14#define UNINITIALIZED_MSEC ((SkMSec)-1)
15
16SkMovie::SkMovie()
17{
18 fInfo.fDuration = UNINITIALIZED_MSEC; // uninitialized
19 fCurrTime = UNINITIALIZED_MSEC; // uninitialized
20 fNeedBitmap = true;
21}
22
23void SkMovie::ensureInfo()
24{
25 if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo))
26 memset(&fInfo, 0, sizeof(fInfo)); // failure
27}
28
29SkMSec SkMovie::duration()
30{
31 this->ensureInfo();
32 return fInfo.fDuration;
33}
34
35int SkMovie::width()
36{
37 this->ensureInfo();
38 return fInfo.fWidth;
39}
40
41int SkMovie::height()
42{
43 this->ensureInfo();
44 return fInfo.fHeight;
45}
46
47int SkMovie::isOpaque()
48{
49 this->ensureInfo();
50 return fInfo.fIsOpaque;
51}
52
53bool SkMovie::setTime(SkMSec time)
54{
55 SkMSec dur = this->duration();
56 if (time > dur)
57 time = dur;
rmistry@google.comd6176b02012-08-23 18:14:13 +000058
reed@android.com8a1c16f2008-12-17 15:59:43 +000059 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
69const SkBitmap& SkMovie::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
85#include "SkStream.h"
86
87SkMovie* SkMovie::DecodeMemory(const void* data, size_t length) {
88 SkMemoryStream stream(data, length, false);
89 return SkMovie::DecodeStream(&stream);
90}
91
mike@reedtribe.orgf3811622013-03-19 02:18:33 +000092SkMovie* SkMovie::DecodeFile(const char path[]) {
scroggoa1193e42015-01-21 12:09:53 -080093 SkAutoTDelete<SkStreamRewindable> stream(SkStream::NewFromFile(path));
mike@reedtribe.orgf3811622013-03-19 02:18:33 +000094 return stream.get() ? SkMovie::DecodeStream(stream) : NULL;
reed@android.com8a1c16f2008-12-17 15:59:43 +000095}