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