blob: ed74329e1474e0d896a6a61ceba70b26a024e658 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/* libs/graphics/animator/SkDisplayMovie.cpp
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#include "SkDisplayMovie.h"
19#include "SkAnimateMaker.h"
20#include "SkCanvas.h"
21#include "SkPaint.h"
22
23#if SK_USE_CONDENSED_INFO == 0
24
25const SkMemberInfo SkDisplayMovie::fInfo[] = {
26 SK_MEMBER(src, String)
27};
28
29#endif
30
31DEFINE_GET_MEMBER(SkDisplayMovie);
32
33SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false), fMovieBuilt(false) {
34 fMovie.fMaker->fInMovie = true;
35}
36
37SkDisplayMovie::~SkDisplayMovie() {
38}
39
40void SkDisplayMovie::buildMovie() {
41 if (fMovieBuilt)
42 return;
43 SkAnimateMaker* movieMaker = fMovie.fMaker;
44 SkAnimateMaker* parentMaker = movieMaker->fParentMaker;
45 if (src.size() == 0 || parentMaker == NULL)
46 return;
47 movieMaker->fPrefix.set(parentMaker->fPrefix);
48 fDecodedSuccessfully = fMovie.fMaker->decodeURI(src.c_str());
49 if (fDecodedSuccessfully == false) {
50
51 if (movieMaker->getErrorCode() != SkXMLParserError::kNoError || movieMaker->getNativeCode() != -1) {
52 movieMaker->setInnerError(parentMaker, src);
53 parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie);
54 } else {
55 parentMaker->setErrorNoun(src);
56 parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknownOrMissing);
57 }
58 }
59 fMovieBuilt = true;
60}
61
62SkDisplayable* SkDisplayMovie::deepCopy(SkAnimateMaker* maker) {
63 SkDisplayMovie* copy = (SkDisplayMovie*) INHERITED::deepCopy(maker);
64 copy->fMovie.fMaker->fParentMaker = fMovie.fMaker->fParentMaker;
65 copy->fMovie.fMaker->fHostEventSinkID = fMovie.fMaker->fHostEventSinkID;
66 copy->fMovieBuilt = false;
67 *fMovie.fMaker->fParentMaker->fMovies.append() = copy;
68 return copy;
69}
70
71void SkDisplayMovie::dirty() {
72 buildMovie();
73}
74
75bool SkDisplayMovie::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) {
76 if (fLoaded == false)
77 return false;
78 fMovie.fMaker->fEnableTime = fMovie.fMaker->fParentMaker->fEnableTime;
79 return fMovie.fMaker->fEvents.doEvent(*fMovie.fMaker, kind, state);
80}
81
82bool SkDisplayMovie::draw(SkAnimateMaker& maker) {
83 if (fDecodedSuccessfully == false)
84 return false;
85 if (fLoaded == false)
86 enable(maker);
87 maker.fCanvas->save();
88 SkPaint local = SkPaint(*maker.fPaint);
89 bool result = fMovie.draw(maker.fCanvas, &local,
90 maker.fDisplayList.getTime()) != SkAnimator::kNotDifferent;
91 maker.fDisplayList.fInvalBounds.join(fMovie.fMaker->fDisplayList.fInvalBounds);
92 maker.fCanvas->restore();
93 return result;
94}
95
96#ifdef SK_DUMP_ENABLED
97void SkDisplayMovie::dump(SkAnimateMaker* maker) {
98 dumpBase(maker);
99 SkDebugf("src=\"%s\"/>\n", src.c_str());
100 SkAnimateMaker* movieMaker = fMovie.fMaker;
101 SkDisplayList::fIndent += 4;
102 movieMaker->fDisplayList.dumpInner(movieMaker);
103 SkDisplayList::fIndent -= 4;
104 dumpEnd(maker);
105}
106
107void SkDisplayMovie::dumpEvents() {
108 fMovie.fMaker->fEvents.dump(*fMovie.fMaker);
109}
110#endif
111
112bool SkDisplayMovie::enable(SkAnimateMaker& maker) {
113 if (fDecodedSuccessfully == false)
114 return false;
115 SkAnimateMaker* movieMaker = fMovie.fMaker;
116 movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL);
117 movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL);
118 fLoaded = true;
119 movieMaker->fLoaded = true;
120 return false;
121}
122
123bool SkDisplayMovie::hasEnable() const {
124 return true;
125}
126
127void SkDisplayMovie::onEndElement(SkAnimateMaker& maker) {
128#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
129 fMovie.fMaker->fDebugTimeBase = maker.fDebugTimeBase;
130#endif
131 fMovie.fMaker->fPrefix.set(maker.fPrefix);
132 fMovie.fMaker->fHostEventSinkID = maker.fHostEventSinkID;
133 fMovie.fMaker->fParentMaker = &maker;
134 buildMovie();
135 *maker.fMovies.append() = this;
136}
137
138