|
1 |
|
2 /* |
|
3 * Copyright 2006 The Android Open Source Project |
|
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 |
|
9 |
|
10 #include "SkDisplayMovie.h" |
|
11 #include "SkAnimateMaker.h" |
|
12 #include "SkCanvas.h" |
|
13 #include "SkPaint.h" |
|
14 |
|
15 #if SK_USE_CONDENSED_INFO == 0 |
|
16 |
|
17 const SkMemberInfo SkDisplayMovie::fInfo[] = { |
|
18 SK_MEMBER(src, String) |
|
19 }; |
|
20 |
|
21 #endif |
|
22 |
|
23 DEFINE_GET_MEMBER(SkDisplayMovie); |
|
24 |
|
25 SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false), fMovieBuilt(false) { |
|
26 fMovie.fMaker->fInMovie = true; |
|
27 } |
|
28 |
|
29 SkDisplayMovie::~SkDisplayMovie() { |
|
30 } |
|
31 |
|
32 void SkDisplayMovie::buildMovie() { |
|
33 if (fMovieBuilt) |
|
34 return; |
|
35 SkAnimateMaker* movieMaker = fMovie.fMaker; |
|
36 SkAnimateMaker* parentMaker = movieMaker->fParentMaker; |
|
37 if (src.size() == 0 || parentMaker == NULL) |
|
38 return; |
|
39 movieMaker->fPrefix.set(parentMaker->fPrefix); |
|
40 fDecodedSuccessfully = fMovie.fMaker->decodeURI(src.c_str()); |
|
41 if (fDecodedSuccessfully == false) { |
|
42 |
|
43 if (movieMaker->getErrorCode() != SkXMLParserError::kNoError || movieMaker->getNativeCode() != -1) { |
|
44 movieMaker->setInnerError(parentMaker, src); |
|
45 parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie); |
|
46 } else { |
|
47 parentMaker->setErrorNoun(src); |
|
48 parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknownOrMissing); |
|
49 } |
|
50 } |
|
51 fMovieBuilt = true; |
|
52 } |
|
53 |
|
54 SkDisplayable* SkDisplayMovie::deepCopy(SkAnimateMaker* maker) { |
|
55 SkDisplayMovie* copy = (SkDisplayMovie*) INHERITED::deepCopy(maker); |
|
56 copy->fMovie.fMaker->fParentMaker = fMovie.fMaker->fParentMaker; |
|
57 copy->fMovie.fMaker->fHostEventSinkID = fMovie.fMaker->fHostEventSinkID; |
|
58 copy->fMovieBuilt = false; |
|
59 *fMovie.fMaker->fParentMaker->fMovies.append() = copy; |
|
60 return copy; |
|
61 } |
|
62 |
|
63 void SkDisplayMovie::dirty() { |
|
64 buildMovie(); |
|
65 } |
|
66 |
|
67 bool SkDisplayMovie::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) { |
|
68 if (fLoaded == false) |
|
69 return false; |
|
70 fMovie.fMaker->fEnableTime = fMovie.fMaker->fParentMaker->fEnableTime; |
|
71 return fMovie.fMaker->fEvents.doEvent(*fMovie.fMaker, kind, state); |
|
72 } |
|
73 |
|
74 bool SkDisplayMovie::draw(SkAnimateMaker& maker) { |
|
75 if (fDecodedSuccessfully == false) |
|
76 return false; |
|
77 if (fLoaded == false) |
|
78 enable(maker); |
|
79 maker.fCanvas->save(); |
|
80 SkPaint local = SkPaint(*maker.fPaint); |
|
81 bool result = fMovie.draw(maker.fCanvas, &local, |
|
82 maker.fDisplayList.getTime()) != SkAnimator::kNotDifferent; |
|
83 maker.fDisplayList.fInvalBounds.join(fMovie.fMaker->fDisplayList.fInvalBounds); |
|
84 maker.fCanvas->restore(); |
|
85 return result; |
|
86 } |
|
87 |
|
88 #ifdef SK_DUMP_ENABLED |
|
89 void SkDisplayMovie::dump(SkAnimateMaker* maker) { |
|
90 dumpBase(maker); |
|
91 SkDebugf("src=\"%s\"/>\n", src.c_str()); |
|
92 SkAnimateMaker* movieMaker = fMovie.fMaker; |
|
93 SkDisplayList::fIndent += 4; |
|
94 movieMaker->fDisplayList.dumpInner(movieMaker); |
|
95 SkDisplayList::fIndent -= 4; |
|
96 dumpEnd(maker); |
|
97 } |
|
98 |
|
99 void SkDisplayMovie::dumpEvents() { |
|
100 fMovie.fMaker->fEvents.dump(*fMovie.fMaker); |
|
101 } |
|
102 #endif |
|
103 |
|
104 bool SkDisplayMovie::enable(SkAnimateMaker&) { |
|
105 if (fDecodedSuccessfully == false) |
|
106 return false; |
|
107 SkAnimateMaker* movieMaker = fMovie.fMaker; |
|
108 movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL); |
|
109 movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL); |
|
110 fLoaded = true; |
|
111 movieMaker->fLoaded = true; |
|
112 return false; |
|
113 } |
|
114 |
|
115 bool SkDisplayMovie::hasEnable() const { |
|
116 return true; |
|
117 } |
|
118 |
|
119 void SkDisplayMovie::onEndElement(SkAnimateMaker& maker) { |
|
120 #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING |
|
121 fMovie.fMaker->fDebugTimeBase = maker.fDebugTimeBase; |
|
122 #endif |
|
123 fMovie.fMaker->fPrefix.set(maker.fPrefix); |
|
124 fMovie.fMaker->fHostEventSinkID = maker.fHostEventSinkID; |
|
125 fMovie.fMaker->fParentMaker = &maker; |
|
126 buildMovie(); |
|
127 *maker.fMovies.append() = this; |
|
128 } |