OLD | NEW |
| (Empty) |
1 /* 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 | |
25 const SkMemberInfo SkDisplayMovie::fInfo[] = { | |
26 SK_MEMBER(src, String) | |
27 }; | |
28 | |
29 #endif | |
30 | |
31 DEFINE_GET_MEMBER(SkDisplayMovie); | |
32 | |
33 SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false),
fMovieBuilt(false) { | |
34 fMovie.fMaker->fInMovie = true; | |
35 } | |
36 | |
37 SkDisplayMovie::~SkDisplayMovie() { | |
38 } | |
39 | |
40 void 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 || movieMak
er->getNativeCode() != -1) { | |
52 movieMaker->setInnerError(parentMaker, src); | |
53 parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie); | |
54 } else { | |
55 parentMaker->setErrorNoun(src); | |
56 parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknown
OrMissing); | |
57 } | |
58 } | |
59 fMovieBuilt = true; | |
60 } | |
61 | |
62 SkDisplayable* 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 | |
71 void SkDisplayMovie::dirty() { | |
72 buildMovie(); | |
73 } | |
74 | |
75 bool 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 | |
82 bool 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.fInvalBound
s); | |
92 maker.fCanvas->restore(); | |
93 return result; | |
94 } | |
95 | |
96 #ifdef SK_DUMP_ENABLED | |
97 void 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 | |
107 void SkDisplayMovie::dumpEvents() { | |
108 fMovie.fMaker->fEvents.dump(*fMovie.fMaker); | |
109 } | |
110 #endif | |
111 | |
112 bool 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 | |
123 bool SkDisplayMovie::hasEnable() const { | |
124 return true; | |
125 } | |
126 | |
127 void 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 | |
OLD | NEW |