1
/* libs/graphics/animator/SkDisplayMovie.cpp
3
** Copyright 2006, The Android Open Source Project
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
9
** http://www.apache.org/licenses/LICENSE-2.0
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.
18
#include "SkDisplayMovie.h"
19
#include "SkAnimateMaker.h"
23
#if SK_USE_CONDENSED_INFO == 0
25
const SkMemberInfo SkDisplayMovie::fInfo[] = {
26
SK_MEMBER(src, String)
31
DEFINE_GET_MEMBER(SkDisplayMovie);
33
SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false), fMovieBuilt(false) {
34
fMovie.fMaker->fInMovie = true;
37
SkDisplayMovie::~SkDisplayMovie() {
40
void SkDisplayMovie::buildMovie() {
43
SkAnimateMaker* movieMaker = fMovie.fMaker;
44
SkAnimateMaker* parentMaker = movieMaker->fParentMaker;
45
if (src.size() == 0 || parentMaker == NULL)
47
movieMaker->fPrefix.set(parentMaker->fPrefix);
48
fDecodedSuccessfully = fMovie.fMaker->decodeURI(src.c_str());
49
if (fDecodedSuccessfully == false) {
51
if (movieMaker->getErrorCode() != SkXMLParserError::kNoError || movieMaker->getNativeCode() != -1) {
52
movieMaker->setInnerError(parentMaker, src);
53
parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie);
55
parentMaker->setErrorNoun(src);
56
parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknownOrMissing);
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;
71
void SkDisplayMovie::dirty() {
75
bool SkDisplayMovie::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) {
78
fMovie.fMaker->fEnableTime = fMovie.fMaker->fParentMaker->fEnableTime;
79
return fMovie.fMaker->fEvents.doEvent(*fMovie.fMaker, kind, state);
82
bool SkDisplayMovie::draw(SkAnimateMaker& maker) {
83
if (fDecodedSuccessfully == false)
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();
96
#ifdef SK_DUMP_ENABLED
97
void SkDisplayMovie::dump(SkAnimateMaker* 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;
107
void SkDisplayMovie::dumpEvents() {
108
fMovie.fMaker->fEvents.dump(*fMovie.fMaker);
112
bool SkDisplayMovie::enable(SkAnimateMaker& maker) {
113
if (fDecodedSuccessfully == false)
115
SkAnimateMaker* movieMaker = fMovie.fMaker;
116
movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL);
117
movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL);
119
movieMaker->fLoaded = true;
123
bool SkDisplayMovie::hasEnable() const {
127
void SkDisplayMovie::onEndElement(SkAnimateMaker& maker) {
128
#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
129
fMovie.fMaker->fDebugTimeBase = maker.fDebugTimeBase;
131
fMovie.fMaker->fPrefix.set(maker.fPrefix);
132
fMovie.fMaker->fHostEventSinkID = maker.fHostEventSinkID;
133
fMovie.fMaker->fParentMaker = &maker;
135
*maker.fMovies.append() = this;