1
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 */
8#include "SkMovie.h"
9#include "SkCanvas.h"
10#include "SkPaint.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 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;
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
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
92SkMovie* SkMovie::DecodeFile(const char path[]) {
93    SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path));
94    return stream.get() ? SkMovie::DecodeStream(stream) : NULL;
95}
96