michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkDisplayMovie.h" michael@0: #include "SkAnimateMaker.h" michael@0: #include "SkCanvas.h" michael@0: #include "SkPaint.h" michael@0: michael@0: #if SK_USE_CONDENSED_INFO == 0 michael@0: michael@0: const SkMemberInfo SkDisplayMovie::fInfo[] = { michael@0: SK_MEMBER(src, String) michael@0: }; michael@0: michael@0: #endif michael@0: michael@0: DEFINE_GET_MEMBER(SkDisplayMovie); michael@0: michael@0: SkDisplayMovie::SkDisplayMovie() : fDecodedSuccessfully(false), fLoaded(false), fMovieBuilt(false) { michael@0: fMovie.fMaker->fInMovie = true; michael@0: } michael@0: michael@0: SkDisplayMovie::~SkDisplayMovie() { michael@0: } michael@0: michael@0: void SkDisplayMovie::buildMovie() { michael@0: if (fMovieBuilt) michael@0: return; michael@0: SkAnimateMaker* movieMaker = fMovie.fMaker; michael@0: SkAnimateMaker* parentMaker = movieMaker->fParentMaker; michael@0: if (src.size() == 0 || parentMaker == NULL) michael@0: return; michael@0: movieMaker->fPrefix.set(parentMaker->fPrefix); michael@0: fDecodedSuccessfully = fMovie.fMaker->decodeURI(src.c_str()); michael@0: if (fDecodedSuccessfully == false) { michael@0: michael@0: if (movieMaker->getErrorCode() != SkXMLParserError::kNoError || movieMaker->getNativeCode() != -1) { michael@0: movieMaker->setInnerError(parentMaker, src); michael@0: parentMaker->setErrorCode(SkDisplayXMLParserError::kInMovie); michael@0: } else { michael@0: parentMaker->setErrorNoun(src); michael@0: parentMaker->setErrorCode(SkDisplayXMLParserError::kMovieNameUnknownOrMissing); michael@0: } michael@0: } michael@0: fMovieBuilt = true; michael@0: } michael@0: michael@0: SkDisplayable* SkDisplayMovie::deepCopy(SkAnimateMaker* maker) { michael@0: SkDisplayMovie* copy = (SkDisplayMovie*) INHERITED::deepCopy(maker); michael@0: copy->fMovie.fMaker->fParentMaker = fMovie.fMaker->fParentMaker; michael@0: copy->fMovie.fMaker->fHostEventSinkID = fMovie.fMaker->fHostEventSinkID; michael@0: copy->fMovieBuilt = false; michael@0: *fMovie.fMaker->fParentMaker->fMovies.append() = copy; michael@0: return copy; michael@0: } michael@0: michael@0: void SkDisplayMovie::dirty() { michael@0: buildMovie(); michael@0: } michael@0: michael@0: bool SkDisplayMovie::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) { michael@0: if (fLoaded == false) michael@0: return false; michael@0: fMovie.fMaker->fEnableTime = fMovie.fMaker->fParentMaker->fEnableTime; michael@0: return fMovie.fMaker->fEvents.doEvent(*fMovie.fMaker, kind, state); michael@0: } michael@0: michael@0: bool SkDisplayMovie::draw(SkAnimateMaker& maker) { michael@0: if (fDecodedSuccessfully == false) michael@0: return false; michael@0: if (fLoaded == false) michael@0: enable(maker); michael@0: maker.fCanvas->save(); michael@0: SkPaint local = SkPaint(*maker.fPaint); michael@0: bool result = fMovie.draw(maker.fCanvas, &local, michael@0: maker.fDisplayList.getTime()) != SkAnimator::kNotDifferent; michael@0: maker.fDisplayList.fInvalBounds.join(fMovie.fMaker->fDisplayList.fInvalBounds); michael@0: maker.fCanvas->restore(); michael@0: return result; michael@0: } michael@0: michael@0: #ifdef SK_DUMP_ENABLED michael@0: void SkDisplayMovie::dump(SkAnimateMaker* maker) { michael@0: dumpBase(maker); michael@0: SkDebugf("src=\"%s\"/>\n", src.c_str()); michael@0: SkAnimateMaker* movieMaker = fMovie.fMaker; michael@0: SkDisplayList::fIndent += 4; michael@0: movieMaker->fDisplayList.dumpInner(movieMaker); michael@0: SkDisplayList::fIndent -= 4; michael@0: dumpEnd(maker); michael@0: } michael@0: michael@0: void SkDisplayMovie::dumpEvents() { michael@0: fMovie.fMaker->fEvents.dump(*fMovie.fMaker); michael@0: } michael@0: #endif michael@0: michael@0: bool SkDisplayMovie::enable(SkAnimateMaker&) { michael@0: if (fDecodedSuccessfully == false) michael@0: return false; michael@0: SkAnimateMaker* movieMaker = fMovie.fMaker; michael@0: movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL); michael@0: movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL); michael@0: fLoaded = true; michael@0: movieMaker->fLoaded = true; michael@0: return false; michael@0: } michael@0: michael@0: bool SkDisplayMovie::hasEnable() const { michael@0: return true; michael@0: } michael@0: michael@0: void SkDisplayMovie::onEndElement(SkAnimateMaker& maker) { michael@0: #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING michael@0: fMovie.fMaker->fDebugTimeBase = maker.fDebugTimeBase; michael@0: #endif michael@0: fMovie.fMaker->fPrefix.set(maker.fPrefix); michael@0: fMovie.fMaker->fHostEventSinkID = maker.fHostEventSinkID; michael@0: fMovie.fMaker->fParentMaker = &maker; michael@0: buildMovie(); michael@0: *maker.fMovies.append() = this; michael@0: }